[c]HDOJ1874 Dijkstra算法求最短路径

来源:互联网 发布:软件开发 质量奖项 编辑:程序博客网 时间:2024/05/21 06:31

http://acm.hdu.edu.cn/showproblem.php?pid=1874

题目标题:畅通工程续

题目大意:给出一个图与起点和终点,求两个点之间权值最小的路径


一个很基础的求最短路径的题,我用的Dijkstra算法来做的最短路径,Dijkstra算法类似于Prim算法,都是利用一个辅助数组来存关键点的最短距离,这个题有一个陷阱就是两个城市之间可能有好几条路(坑死人)


#include<iostream>#include<stdio.h>#include<string.h>#define Debug 0using namespace std;int a[205][205];int d[205];bool Judge[205];int m,n;int Shortest(int start,int end){for(int i=0;i<n;i++){d[i]=a[start][i];}d[start]=0;Judge[start]=0;for(int i=1;i<n;i++)    {    int sign;    int min=1000001;    for(int j=0;j<n;j++){    if(!Judge[j]){    if(d[j]<min){    sign=j;    min=d[j];    }    }    }    Judge[sign]=1;    for(int j=0;j<n;j++){    if(!Judge[j] && (min+a[sign][j])<d[j]){    d[j]=min+a[sign][j];    }    }}if(Debug){for(int i=0;i<n;i++){cout<<d[i]<<' ';}cout<<endl;}if(d[end]>1000000) d[end]=-1;return d[end];}int main(){while(cin>>n>>m){memset(a,1000001,sizeof(int)*205*205);memset(Judge,0,sizeof(bool)*205);for(int i=0;i<m;i++){int x,y,z;cin>>x>>y>>z;if(z<a[x][y]){a[x][y]=z;a[y][x]=z;}}if(Debug){for(int i=0;i<n;i++){for(int j=0;j<n;j++){cout<<a[i][j]<<' ';}cout<<endl;}}int s,e;cin>>s>>e;cout<<Shortest(s,e)<<endl;}return 0;}


0 0
原创粉丝点击