hdu2544 最短路

来源:互联网 发布:java 就业周末班 编辑:程序博客网 时间:2024/05/30 22:55
题目: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 距离为020     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 }