德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。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 }