题目:最短路
题目链接: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;
}