Save Pang Pang
- 题目链接
- Save Pang Pang
- 题目大意
就是一个人在C点,另外一人在D点,现在有m条路,告诉你每条路的信息,要你从C点走到D点——赤裸裸的最短路径。
- 题解
这一题是武科邀请赛的一到水题,当时看到直接就开始写了,结果用SPFA怎么也没过,第二天才发现是初始化的问题——我直接把和原点相连的点的距离做成了dist,但是这一题有自环……
虽然不怎么难,还是记一下,算是个警醒吧。
- 代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
struct edge
{
int u,v,d,next;
};
edge e[100005];
int pre[100005],q[1005],d[100005],n,m,C,D,k;
bool flag[100005];
void spfa(int C)
{
int h=0,t=0;
q[h++]=C;
flag[C]=1;
while (h!=t)
{
for (int i=pre[q[t]];i!=0;i=e[i].next)
{
int u=e[i].u,v=e[i].v,dist=e[i].d;
if (d[v]>d[u]+dist)
{
d[v]=d[u]+dist;
if (!flag[v])
{
flag[v]=1;
q[h]=v;
h=(h+1)%(n+1);
}
}
}
flag[q[t]]=0;
t=(t+1)%(1+n);
}
}
int main()
{
while(scanf("%d%d%d%d%d",&n,&m,&C,&D,&k)!=EOF)
{
memset(d,0x3f,sizeof(d));
memset(e,0,sizeof(e));
memset(flag,0,sizeof(flag));
memset(q,0,sizeof(q));
memset(pre,0,sizeof(pre));
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].d);
e[i].next=pre[e[i].u]; pre[e[i].u]=i;
}
d[C]=0;
spfa(C);
if (d[D]<=k) printf("%d\n",d[D]);
else printf("Sorry\n");
}
return 0;
}