单源最短路径,首先想到的是Dijkstra。Dijkstra算法的思路就不啰嗦了,概括起来就是时刻保持当前节点到目标节点的距离最短。
题目大意(不进行翻译解释了,就抽离为图来表达):有N个顶点和T条边的无向图,求从1号顶点到N号顶点的最短距离是多少。
Sample Input:(先T后N!先T后N!先T后N!)
5 5
1 2 20 //分别是两个顶点v1、v2,以及它们之间的权值
2 3 30
3 4 20
4 5 20
1 5 100
Sample Output:
90
由于比较简单,所以也不需要太多注释。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define size 1001 5 #define INF 0x3f3f3f3f 6 using namespace std; 7 int N,T,a,b,c,i,j,k; 8 int land[size][size],dis[size],flag[size]; 9 10 int min(int a,int b)//树的维护那里可以用判断语句,也可以用这个来选出较小的那个 11 { 12 return ((a)<(b))?(a):(b); 13 } 14 15 void init()//初始化 16 { 17 memset(land,INF,sizeof(land)); 18 memset(dis,INF,sizeof(dis)); 19 memset(flag,0,sizeof(flag)); 20 } 21 22 void Dijkstra() 23 { 24 dis[1]=0; 25 for(i=1;i<N;i++)//遍历 26 { 27 int M=INF,X; 28 for(j=1;j<=N;j++) 29 { 30 if(!flag[j]&&dis[j]<M) 31 { 32 M=dis[j]; 33 X=j; 34 } 35 } 36 flag[X]=1;//标记 37 for(k=1;k<=N;k++)//维护 38 dis[k]=min(dis[k],dis[X]+land[X][k]); 39 } 40 cout<<dis[N]<<endl; 41 } 42 43 int main() 44 { 45 while(cin>>T>>N) 46 { 47 init(); 48 while(T--) 49 { 50 cin>>a>>b>>c; 51 if(land[a][b]>c)//只记录最短的 52 land[a][b]=land[b][a]=c; 53 } 54 Dijkstra(); 55 } 56 return 0; 57 }