HDU 2066 一个人的旅行 (floyd)

代码:
#include<cstdio>
 #include<cstring>
 #include<cstdlib>
 #define inf 0x3fffffff
 int map[1001][1001],max;
 bool start[1001],end[1001];
 int floyd()
 {
     int i,j,k,min=inf;
     for(i=1;i<=max;++i)
         for(j=1;j<=max;++j)
             if(map[j][i]!=inf)
             {
                 for(k=1;k<=max;++k)
                 {
                     map[j][k]=map[j][k]<map[j][i]+map[i][k]?map[j][k]:map[j][i]+map[i][k];
                     if(start[j]&&end[k]&&min>map[j][k])   //j是起点而且k是终点,则直接找最小值
                         min=map[j][k];
                 }
             }
     return min;
 }
 
 int main()
 {
     int t,s,d,i,j,a,b,time,tmp;
     while(scanf("%d%d%d",&t,&s,&d)!=EOF)
     {
         max=0;
         for(i=1;i<=1000;++i)
             for(j=1;j<=1000;++j)
                 map[i][j]=inf;
         for(i=1;i<=t;++i)
         {
             scanf("%d%d%d",&a,&b,&time);
             max=max>a?max:b;       //max记录最大的城市编号,减小floyd计算量
             max=max>b?max:b;
             map[a][b]=map[b][a]=map[a][b]<time?map[a][b]:time;
         }
         memset(start,false,sizeof(start));
         memset(end,false,sizeof(end));
         for(i=0;i<s;++i)
         {
             scanf("%d",&tmp);
             start[tmp]=true;  //start数组用来标记是否是起点
         }
         for(i=0;i<d;++i)
         {
             scanf("%d",&tmp);
             end[tmp]=true;   //end数组用来标记是否是终点
         }
         printf("%d\n",floyd());
     }
     return 0;
 }



直接抄的网上题解的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值