HDU1874 (dijkstral算法)

来源:互联网 发布:php define const 区别 编辑:程序博客网 时间:2024/06/15 15:15

居然有重边.....

有重边也就罢了居然可以起点和终点一样!!

1:重边选择最小的;

2:起点和终点相同的时候输出0.

这样就行了.

#include <stdio.h>#include <string.h>#define MAX 1000000int maps[202][202];int M,N;int visited[202],lowcost[202];void init(){int i,h;int x,y,z;for(i=0;i<N;i++)for(h=0;h<N;h++)maps[i][h]=MAX;for(i=0;i<M;i++){scanf("%d%d%d",&x,&y,&z);if(maps[x][y]>z)maps[x][y]=maps[y][x]=z;}}void dijkstral(int begin,int end){int i,min,h,temp;memset(visited,0,sizeof(visited));memset(lowcost,0,sizeof(lowcost));for(i=0;i<N;i++)lowcost[i]=maps[begin][i];visited[begin]=1;while(1){min = MAX;temp = begin;for(i=0;i<N;i++){if(!visited[i]&&min>lowcost[i]){min=lowcost[i];temp=i;}}if(temp==begin)break;visited[temp]=1;for(h=0;h<N;h++){if(!visited[h])if(maps[temp][h]+min<lowcost[h])lowcost[h]=maps[temp][h]+min;}}}int main(){int begin,end;while(~scanf("%d%d",&N,&M)){init();scanf("%d%d",&begin,&end);if(begin==end)printf("0\n");else{dijkstral(begin,end);if(visited[end])printf("%d\n",lowcost[end]);elseprintf("-1\n");}}return 0;}


原创粉丝点击