HDU 2544

最短路

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19671 Accepted Submission(s): 8411


Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?


Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。

Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

Sample Input
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0

Sample Output
3 2
这份代码错在哪求指正。



#include <stdio.h>

#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <time.h>


int graph[110][110][2];
int dist[110];
int s[110];
int node;
int edit;
void solve()
{
for(int i=1;i<=node;i++)//初始化dist,所有的都从2开始计算 
    {
    if(graph[1][i][0]==1)
    {
    dist[i]=graph[1][i][1];
   }
    }
    for(int j=2;j<=node;j++)
{
//printf("entering for loop\n");
   int min=2000;
   int minnum;
   int i;
   for(i=2;i<=node;i++)
   {
    if(s[i]==0&&dist[i]<min&&dist[i]!=-1)
    {
    min=dist[i];
    minnum=i;
   }
    }
    //printf("i=%d,min=%d\n",minnum,min);
//找出最小的 
    s[minnum]=1;//已经存入s集合中 
i=minnum; 
    //更新dist
    int newdist;
for(int k=2;k<=node;k++)
    {
    if(graph[i][k][0]==1)
    {
    newdist=dist[i]+graph[i][k][1];
    if(newdist<dist[k]||dist[k]==-1)
    dist[k]=newdist;
    }
   }
   //for(int ii=1;ii<=node;ii++)
    //printf("%d\t",dist[ii]);
    //printf("\n");
    }
    
}
int main(int argc, char *argv[])
{
freopen("data.in","r",stdin);
while(1)
{
scanf("%d%d",&node,&edit);
//printf("node=%d,edit=%d\n",node,edit);
if(node==0&&edit==0) break;
memset(graph,0,sizeof(graph));
memset(dist,-1,sizeof(dist));
memset(s,0,sizeof(s));
int x,y,z;
for(int i=0;i<edit;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(graph[x][y][0]==1)
{
if(z<graph[x][y][1])
{
graph[x][y][1]=z;
graph[y][x][1]=z;
}
}
else{
graph[x][y][0]=1;
graph[x][y][1]=z;
graph[y][x][0]=1;
graph[y][x][1]=z;}
}//建图完成
        solve();
        if(dist[node]==-1)
        printf("0\n");
        else
        printf("%d\n",dist[node]);
        //for(int i=1;i<=node;i++)
        //printf("%d\t",dist[i]);
        //printf("\n");
}
return 0;

}



  1. Test Data: 
  2. 2 1 
  3. 1 2 3 
  4. 3 3 
  5. 1 2 5 
  6. 2 3 5 
  7. 3 1 2 
  8. 0 0 
  9.  
  10. 5 9 
  11.  1 2 5 
  12.  1 2 2 
  13.  1 3 2 
  14.  1 3 3 
  15.  1 4 3 
  16.  2 3 5 
  17.  2 5 6 
  18.  3 5 4 
  19.  4 5 9 
  20. // 6 
  21. // 1->3->2 的情况 , 很多人的代码都过不了这题 
  22. 5 9 
  23.  1 2 5 
  24.  1 2 7 
  25.  1 3 2 
  26.  1 3 3 
  27.  1 4 3 
  28.  2 3 1 
  29.  2 5 1 
  30.  3 5 4 
  31.  4 5 9 
  32. // 4 
  33. // 1->3->4->2->5 的情况 
  34.  5 5 
  35.  1 2 10 
  36.  1 3 4 
  37.  2 4 2 
  38.  3 4 3 
  39.  2 5 5 
  40. // 14 
  41. // 1->3->4->2->5 的情况 
  42.  5 6 
  43.  1 2 10 
  44.  1 3 4 
  45.  2 4 2 
  46.  3 4 3 
  47.  2 5 5 
  48.  4 5 100 
  49. // 14 
  50. // 非法数据,终极数据 
  51.  2 4 
  52.  1 2 10 
  53.  1 3 4 
  54.  2 4 2 
  55.  3 4 3 
  56. // 9 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值