Dijkstra算法模版,时间复杂度O(n^2)

 1 #include <cstdio>
 2 const int MAX = 1<<20;
 3 int main()
 4 {
 5     int n,m,p,q,l;
 6    while(~scanf("%d%d",&n,&m),n||m)
 7    {
 8        int map[101][101], mark[101]={0};
 9        for(int i=1; i<=n; i++)
10        {
11           for(int j=1; j<=n; j++)
12           {
13              map[i][j] = MAX;    //初始化每条路线的距离 
14           }
15        }
16       for(int i=0; i<m; i++)
17       {
18          scanf("%d%d%d",&p,&q,&l);
19          map[p][q] = map[q][p] = l<map[p][q] ? l:map[p][q];    //重边
20       }
21       mark[1]=1;    //起点设置为已经生成完毕 
22       m = n-1;        //剩下n-1个点未定 
23       while(m--)    //每次确定一个点 
24       {
25           int min = MAX,t;
26          for(int i=2;i<=n;i++)                //枚举节点 
27          {
28              if(!mark[i] && map[1][i]<min)    //找出未被标记的,从起点到目标点距离最短的路线 
29              {
30                  t=i;
31                  min=map[1][i];
32              }
33           }
34           mark[t]=1;
35          for(int i=2;i<=n;i++)                //标记之后在枚举 
36          {                                                                    //地图最大距离不能设置为(1<<31)-1,这边加法会溢出 
37              if(!mark[i] && map[1][t]+map[t][i]<map[1][i])    //通过其他刚才那条最短的线路到目标点的距离比起点到目标点的距离短 
38              {
39                  map[1][i]=map[1][t]+map[t][i];                    //更新距离 
40                 }
41             }
42       }
43         printf("%d\n",map[1][5]);    //起点到任意点 
44    }
45    return 0;
46 }
47 /*
48 6 9
49 1 2 7
50 1 3 9
51 1 6 14
52 2 3 10
53 2 4 15
54 3 4 11
55 3 6 2
56 6 5 9
57 4 5 6
58 */

 

 

posted @ 2013-07-18 13:56  瓶哥  Views(2511)  Comments(0Edit  收藏  举报