传说中的Dijkstra是一个风流俊才,有很多漂亮的妹纸喜欢他,可是不幸的是Dijkstra不和这些妹纸住在一起。他们住在一个王国的各个城市里,对于这些漂亮的妹纸Dijkstra很难抉择选哪位作为自己的妻子,于是他就决定了谁能够算出从Dijkstra的城市出发到自己城市的最近距离他就和谁成亲。对于没有学过数学的这些妹纸可就伤不起了,不过你们倒是可以帮他们解决。
Input Description
输入第一行为两个数n,m。分别代表n个城市(妹纸和Dijkstra每个人住在一个城市里),m代表这些城市之间有多少条路。接下来有m行每行三个数x,y,z代表从x到y的距离是z。 0=<n<=100,0<m<10000,城市的标号从1开始,z的数值大于0。Dijkstra永远住在1号城市。
Output Description
按城市标号从小到大的顺序输出Dijkstra到每个妹纸所在城市的最短距离。
Sample Input
4,3 1,2,1 2,3,1 2,4,1
Sample Output
1,2,2
代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 655674
typedef struct node
{
int vexnum;
int a[50][50];
}Graph;
int final[50],pre[50],disk[50];
void DIJ(Graph G,int v)
{
int i,j,k,min;
int t;
for(i=0;i<G.vexnum;i++)
{
final[i]=0;
pre[i]=0;
disk[i]=G.a[v][i];
}
disk[v]=0;
final[v]=1;
for(j=0;j<G.vexnum-1;j++)
{
int m;
min=MAX;
// printf("%d \n",final[0]);
t=0;
for(k=0;k<G.vexnum;k++)
{
if(!final[k]&&disk[k]<min)
{
min=disk[k];
m=k;
t=1;
}
}
if(t==0)
{
for(int p=0;p<G.vexnum;p++)
{
if(!final[p])
pre[p]=-1;
}
return;
}
pre[m]=min;
final[m]=1;
for(i=0;i<G.vexnum;i++)
{
if(!final[i]&&(disk[m]+G.a[m][i]<disk[i]))
{
disk[i]=disk[m]+G.a[m][i];
// printf("%d \n",final[j]);
}
}
}
}
int main()
{
int i,j,n;
Graph G;
scanf("%d,%d",&G.vexnum,&n);
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
{
G.a[i][j]=MAX;
}
}
for(i=0;i<n;i++)
{
int x,y,z;
scanf("%d,%d,%d",&x,&y,&z);
G.a[x-1][y-1]=z;
}
int v=0;
DIJ(G,v);
for(i=0;i<G.vexnum;i++)
{
if(i!=v)
{
printf("%d",pre[i]);
if(i<G.vexnum-1)
printf(",");
}
}
printf("\n");
}