居然有重边.....
有重边也就罢了居然可以起点和终点一样!!
1:重边选择最小的;
2:起点和终点相同的时候输出0.
这样就行了.
#include <stdio.h>
#include <string.h>
#define MAX 1000000
int 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]);
else
printf("-1\n");
}
}
return 0;
}