Dijkstra的魅力

版权声明:欢迎转载,如果转载,请注明转载地址,谢谢! 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40763929/article/details/84639944