2019_GDUT_新生专题 图论 B

题目:最短路

题目链接:https://vjudge.net/contest/351234#problem/B

题目描述:给出点和路,求两点最短路。

反思(这是模板题,没什么分析的):
1.我代码运行时长为998ms(在TML边缘疯狂试探),主要原因是我用了自己手写的选排。果然快排好。
2.另外差点忘了限制搜索深度,如果那样,绝对超时。

代码:

#include <stdio.h>
//吐槽一下代码
int b[102],n,m;
struct Way     //这结构体成员名字太长了
{
    int start;
    int enf;
    int length;
}a[10001];
void e_sort()  //手写选排,写得慢,排得慢
{
  int i,j,t;
  struct Way k;
  for(i=0;i<2*m;i++)
  {
      for(j=i,t=i;j<2*m;j++)
      {
          if(a[j].start<a[t].start) t=j;
      }
      if(t!=i)
      {
          k=a[i];
          a[i]=a[t];
          a[t]=k;
      }
  }
}
int f(int num)
{
    int i;
    for(i=0;i<2*m;i++)      //每次都从0开始搜,太慢了
    {
        if(a[i].start==num)
        {
            if(b[a[i].enf]>b[a[i].start]+a[i].length)
               {b[a[i].enf]=b[a[i].start]+a[i].length;
                 if(a[i].enf!=n) f(a[i].enf);     //搜到终点就停
               }
        }
        else if(a[i].start>num) return 0;
    }
    return 0;
}
int main()
{
    int i;
    while(1)   //可以写成while(scanf("%d%d",&n,&m)!EOF&&n)
    {   scanf("%d%d",&n,&m);
        if(n==0) break;
        for(i=0;i<2*m;i+=2)
        {
        scanf("%d%d%d",&a[i].start,&a[i].enf,&a[i].length);
        a[i+1].start=a[i].enf;
        a[i+1].enf=a[i].start;
        a[i+1].length=a[i].length;
        }
        e_sort();
        {             //没用的花括号
        b[1]=0;
        for(i=2;i<=n;i++)
        {
            b[i]=10000000;
        }
        for(i=0;i<2*m;i++)
            if(b[a[i].enf]>b[a[i].start]+a[i].length)
            {
                b[a[i].enf]=b[a[i].start]+a[i].length;//太长了,符号又多,影响手速
                if(a[i].enf!=n)f(a[i].enf);           //应用函数替代,并缩短名字
            }

        }
       printf("%d\n",b[n]);
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值