(精)hdoj 2544(最短路,地杰斯特拉算法)(无向图)

来源:互联网 发布:js div删除classname 编辑:程序博客网 时间:2024/04/17 03:59
/*1 这一题的程序根图有一点不一样。图中的顶点全部都+1就可以了*/#include<iostream>#include<stdio.h>using namespace std;#define MAX 103//#define MAX 8#define INF 1000002int map[MAX][MAX];//从i到j的距离int visited[MAX];int cost[MAX];//这个是计算出来的最短路径int point,road;int min(int a,int b){if(a>b)return b;return a;}void init(){int i,j;for(i=0;i<MAX;i++){for(j=0;j<MAX;j++){map[i][j]=INF;}visited[i]=0;cost[i]=INF;}}int noroad()//从已经访问过的集合当中找,下一步可以方位的点。{int i=1;int j=1;for(i=1;i<=point;i++)//选中第i点(i是以访问过的点集合){if(visited[i]==1){for(j=1;j<=point;j++){if(visited[j]==0&&map[i][j]!=INF)//map[j]!=0表示有通路,visited[j]表示j没有访问过。return 0;}}}return 1;}void dij(){visited[1]=1;cost[1]=0;while(!noroad()){int i=1,j=1;int tmin=INF;int tj;for(i=1;i<=point;i++)//选中第i个顶定{if(visited[i]==1){for(j=1;j<=point;j++)//第i个点到j个点{if(map[i][j]!=INF&&visited[j]==0){if(tmin>cost[i]+map[i][j]){tmin=cost[i]+map[i][j];tj=j;}}}}}//forvisited[tj]=1;cost[tj]=tmin;//更新路径//如果加入tj这个点以后,从vo到T中的点的距离变短了,那么修改for(i=1;i<=point;i++){if(visited[i]==0){cost[i]=min(cost[i],cost[tj]+map[tj][i]);}}}//while}int main(){//freopen("in.txt","r",stdin);while(scanf("%d %d",&point,&road)){//初始化init();//输入if(point==0&&road==0)return 0;int i=0;for(i=0;i<road;i++){int a,b,c;scanf("%d %d %d",&a,&b,&c);map[a][b]=c;map[b][a]=c;}//处理dij();/*//输出for(i=1;i<=point;i++){cout<<cost[i]<<endl;}cout<<endl;cout<<endl;*/cout<<cost[point]<<endl;}return 0;}/*输入6 81 3 101 5 301 6 1002 3 53 4 504 6 105 6 605 4 205 61 3 21 4 23 4 31 5 124 2 345 2 240输出01000002105030600362212*/

原创粉丝点击