標籤:
德克薩斯純樸的民眾們這個夏天正在遭受巨大的熱浪!!!他們的德克薩斯長角牛吃起來不錯,可是他們並不是很擅長生產富含奶油的乳製品。Farmer John此時以先天下之憂而憂,後天下之樂而樂的精神,身先士卒地承擔起向德克薩斯運送大量的營養冰涼的牛奶的重任,以減輕德克薩斯人忍受酷暑的痛苦。
FJ已經研究過可以把牛奶從威斯康辛運送到德克薩斯州的路線。這些路線包括起始點和終點先一共經過T (1 <= T <= 2,500)個城鎮,方便地標號為1到T。除了起點和終點外地每個城鎮由兩條雙向道路連向至少兩個其它地城鎮。每條道路有一個通過費用(包括油費,過路費等等)。
給定一個地圖,包含C (1 <= C <= 6,200)條直接連接2個城鎮的道路。每條道路由道路的起點Rs,終點Re (1 <= Rs <= T; 1 <= Re <= T),和花費(1 <= Ci <= 1,000)組成。求從起始的城鎮Ts (1 <= Ts <= T)到終點的城鎮Te(1 <= Te <= T)最小的總費用。
這題就用dijkstra啦,AC的同時也明白的dijkstra演算法的含義。
變數功能如其名,方便新手一起學習學習
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define MAX 1000000 5 int map[2501][2501];//前一維代表起始點,後一維代表終止點 6 int pointsPassed[2501],shortestDist[2501]; 7 int T,C,Ts,Te;//T=城鎮數 C=道路數 Ts=起始鎮 Te=結束鎮 8 int Rs,Re,Ci; 9 10 int main()11 {12 int i,j,nowMinDist,toPoint;13 scanf("%d%d%d%d",&T,&C,&Ts,&Te);14 15 for(i=1;i<=T;i++)16 for(j=1;j<=T;j++)17 map[i][j]=MAX;18 19 for(i=1;i<=C;i++) 20 {21 scanf("%d%d%d",&Rs,&Re,&Ci);22 if(Ci<=map[Rs][Re])//根據輸入可能會有更便宜的路 23 {24 map[Rs][Re]=Ci;25 map[Re][Rs]=Ci;26 }27 }28 map[Ts][Ts]=0;29 30 for(i=1;i<=T;i++) //初始化 31 {32 shortestDist[i]=map[Ts][i]; 33 pointsPassed[i]=0;34 }35 pointsPassed[Ts]=1;36 37 for(i=2;i<=T;i++)38 {39 nowMinDist=MAX; 40 toPoint=Ts;//每一次都從出發點找與其距離最短的未經過點 41 //現在只是已知到這個點的最短路徑而已 42 43 for(j=1;j<=T;j++)44 if((!pointsPassed[j]) && shortestDist[j]<nowMinDist) 45 {46 toPoint=j; 47 nowMinDist=shortestDist[j];48 }49 50 //收錄此點51 pointsPassed[toPoint]=1;52 for(j=1;j<=T;j++)53 if((!pointsPassed[j]) && map[toPoint][j]!=MAX)//從這個點擴充出向外的點 54 if(shortestDist[toPoint] + map[toPoint][j] < shortestDist[j])55 shortestDist[j]=shortestDist[toPoint] + map[toPoint][j];56 } 57 58 printf("%d",shortestDist[Te]);59 return 0;60 }
CodeVS 1557 熱浪