版权声明:欢迎转载,如果转载,请注明转载地址,谢谢! https://blog.csdn.net/qq_40763929/article/details/84639944
题目描述
传说中的Dijkstra是一个风流俊才,有很多漂亮的妹纸喜欢他,可是不幸的是Dijkstra不和这些妹纸住在一起。他们住在一个王国的各个城市里,对于这些漂亮的妹纸Dijkstra很难抉择选哪位作为自己的妻子,于是他就决定了谁能够算出从Dijkstra的城市出发到自己城市的最近距离他就和谁成亲。对于没有学过数学的这些妹纸可就伤不起了,不过你们倒是可以帮他们解决。
输入描述
输入第一行为两个数n,m。分别代表n个城市(妹纸和Dijkstra每个人住在一个城市里),m代表这些城市之间有多少条路。接下来有m行每行三个数x,y,z代表从x到y的距离是z。 0=<n<=100,0<m<10000,城市的标号从1开始,z的数值大于0。Dijkstra永远住在1号城市。
输出描述
按城市标号从小到大的顺序输出Dijkstra到每个妹纸所在城市的最短距离。
输入样例
4,3 1,2,1 2,3,1 2,4,1
输出样例
1,2,2
提示
- Dijkstra,单源点最短路径
#include<stdio.h>
#define inf 0x3fffffff//最大值
int n,s,m;
int G[105][200];
int vis[200]={0};
int d[200];
void Chopin(int s)//I Love Chopin·s Music
{
int i,j,v;
for ( i=0;i<=102;i++)
d[i] = inf;
d[s] = 0;
for ( i=1;i<=n;i++)
{
int u = -1,MIN = inf;
for ( j=1;j<=n;j++)
{
if (vis[j]==0 && d[j]<MIN)
{
u = j;
MIN = d[j];
}
}
if (u==-1) return;
vis[u] = 1;
for ( v=1;v<=n;v++)
{
if (vis[v]==0 && G[u][v]!=0 && d[u]+G[u][v]<d[v])
d[v] = d[u] + G[u][v];
}
}
}
int main()
{
int i,j,k,x,y,z;
scanf("%d,%d",&n,&m);
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
G[i][j] = inf;//要给每个赋初值
}
}
while(m--)
{
scanf("%d,%d,%d",&x,&y,&z);
G[x][y] = z;//然后覆盖一部分的值
}
Chopin(1);//源点为 1
for (i=1;i<=n;i++)
{
if (i!=1)
{
if (d[i]!=inf)
printf("%d",d[i]);
if (i!=n)
printf(",");
}
}
printf("\n");
return 0;
}