目录
显示
题目链接
https://www.luogu.org/problem/P3385
题解
一道 SPFA 的模板题,但是数据很坑。(chen_zhe真是毒瘤)
这里有几点注意事项:
- 输出不是 “YES” or “NO”;(幸好我眼尖)
- 理论上 bfs-spfa 的复杂度优于 dfs-spfa,但在这题中 dfs-spfa 的运行效率似乎更高;(我的 bfs-spfa 有几个点跑了 980ms)(UPD 2018/12/21:数据重新制作后,dfs-spfa 已经被完美卡掉了)
#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
struct edge
{
int t,w,next;
}e[400005];
int head[20005],q[4000005],d[20005],vis[20005],vt[20005],cnt;
int n,m;
inline void insert(int s,int t,int w)
{
e[++cnt].t=t;
e[cnt].w=w;
e[cnt].next=head[s];
head[s]=cnt;
}
inline bool spfa()
{
int l=0,r=1;
d[1]=0;
q[r]=1;
while(l<r)
{
int h=q[++l];
vis[h]=0;
for(int i=head[h];~i;i=e[i].next)
{
if(d[h]+e[i].w<d[e[i].t])
{
vt[e[i].t]++;
if(vt[e[i].t]>=n)return 1;
d[e[i].t]=d[h]+e[i].w;
if(!vis[e[i].t])
{
q[++r]=e[i].t;
vis[e[i].t]=1;
}
}
}
}
return 0;
}
inline void init()
{
cnt=0;
memset(q,0,sizeof(q));
memset(e,0,sizeof(e));
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
vis[1]=1;
memset(d,INF,sizeof(d));
memset(vt,0,sizeof(vt));
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
insert(a,b,w);
if(w>=0)insert(b,a,w);
}
if(spfa())puts("YE5");
else puts("N0");
}
return 0;
}