hdu2544 最短路

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2544

最短路径DIJKSTRA

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<string.h>
 4 #include<stdlib.h>
 5 #include<limits.h>
 6 #include<iostream>
 7 using namespace std;
 8 const int N=110;
 9 int a[N][N];//用于标记两个路口的默认距离(权值)
10 int use[N];//标记是否使用
11 int d[N];//两点间最短距离
12 int n,m;
13 void dijkstra(int u)
14 {
15     memset(use,0,sizeof(use));
16     for(int i=1;i<=n;i++)
17     d[i]=a[u][i];//初始化赋值
18     use[u]=1;//1路口起点标记使用
19     d[u]=0;//1 1 距离为0
20     for(int i=2;i<=n;i++)
21     {
22         int min=INT_MAX;//理论最大值
23         int v=-1;//设v为一个不可能的点
24         for(int w=1;w<=n;w++)//在所有未标记use中,选择d最小的点
25         {
26             if(!use[w] && d[w]<min)
27             {
28                 min=d[w];
29                 v=w;
30             }
31         }
32         if(v!=-1)//没有路径则不更新
33         {
34             use[v]=1;//标记使用
35             for(int w=1;w<=n;w++)
36             {
37                 if(!use[w] && (a[v][w]<INT_MAX))//确定未使用以及拥有路径
38                 {
39                     if(d[w] > min+a[v][w])//比较,取得最小距离
40                     d[w]=min+a[v][w];
41                 }
42             }
43         }
44     }
45 //    for(int i=1;i<=n;i++)
46 //    printf("%d ",d[i]);
47 //    cout<<endl;
48     printf("%d
",d[n]);
49 }
50 int main()
51 {
52     //freopen("in.txt","r",stdin);
53     while(~scanf("%d%d",&n,&m)&&n&&m)
54     {
55         int x,y,c;
56         for(int i=1;i<=n;i++)
57         {
58             for(int j=1;j<=n;j++)
59             a[i][j]=INT_MAX;
60         }
61         for(int i=0;i<m;i++)
62         {
63             scanf("%d%d%d",&x,&y,&c);
64             a[x][y]=a[y][x]=c;
65         }
66         dijkstra(1);
67     }
68     return 0;
69 }
原文地址:https://www.cnblogs.com/xuesen1995/p/4539321.html