标签:
题目: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\n",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 }
标签:
原文地址:http://www.cnblogs.com/xuesen1995/p/4539321.html