Problem C: Dijkstra的魅力

传说中的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");
}
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安全天天学

你的鼓励是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值