Dijkstra (迪杰斯特拉)最短路算法,算是模板
POJ - 2387
1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 using namespace std;
5 const int INF=0x3f3f3f3f;
6 int book[1005],dis[1005],e[1005][1005];
7
8 int main()
9 {
10 int T,n,u,minn;
11 cin>>T>>n;
12
13 for(int i=1;i<=n;i++)
14 {
15 for(int j=1;j<=n;j++)
16 if(i==j) e[i][j]=0;
17 else e[i][j]=e[j][i]=INF;
18 }
19 for(int i=1;i<=T;i++)
20 {
21 int a,b,c;
22 cin>>a>>b>>c;
23 if(e[a][b]>c) //这步容易落下
24 e[a][b]=e[b][a]=c;
25 }
26 for(int i=1;i<=n;i++)
27 dis[i]=e[1][i];
28 memset(book,0,sizeof(book));
29 book[1]=1; //初始化
30
31 for(int i=1;i<=n-1;i++) //n减去第一个点 就是n-1次
32 {
33 minn=INF;
34 for(int j=1;j<=n;j++)
35 {
36 if(book[j]==0&& dis[j]<minn)
37 {
38 minn=dis[j];
39 u=j; //u记录点的名称
40 }
41 }
42 book[u]=1;//这个点已经是到1的最小的点了,所以下一次不用
43 for(int v=1;v<=n;v++)
44 {
45 if( book[v]==0 && dis[v]>dis[u]+e[u][v]) //如果1到V点的最小值还没算过
46 dis[v]=dis[u]+e[u][v];
47 }
48 }
49 cout<<dis[n]<<endl;
50
51 }