---恢复内容开始---
传送门:https://www.luogu.org/problem/P1993
查分约束:
对于条件1:d[a]-d[b]>=c
d[a]>=d[b]+c
对于条件2:d[a]-d[b]<=c
d[b]>=d[a]-c
对于条件3:d[a]>=d[b]
d[b]>=d[a]
愉快的建边,我的跑最长路,您也可以跑最短路。
本人sq把add写错了TAT
还有就是这道题卡广搜spfa
需要用深搜来实现,所以看(chao)了一下题解的写法......不能说明什么,只能说明我太弱了。
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #define R register using namespace std; int n,m,head[12000],tot,ver[41000],nex[41000],cost[41000]; inline void add(int x,int y,int z){ ver[++tot]=y;nex[tot]=head[x];cost[tot]=z;head[x]=tot; } bool v[12000]; int d[12000],cnt[12000]; inline bool spfa(int x){ v[x]=1; for(R int i=head[x];i;i=nex[i]){ if(d[ver[i]]<d[x]+cost[i]){ d[ver[i]]=d[x]+cost[i]; if(v[ver[i]]) return 0; if(!spfa(ver[i])) return 0; } } v[x]=0; return 1; } int main (){ scanf("%d%d",&n,&m); for(R int op,x,y,z,i=1;i<=m;i++){ scanf("%d%d%d",&op,&x,&y); // longest if(op==1){ scanf("%d",&z); add(y,x,z); } else if(op==2){ scanf("%d",&z); add(x,y,-z); } else if(op==3){ add(x,y,0);add(y,x,0); } } for(R int i=1;i<=n;i++){ add(0,i,0);d[i]=-1e9; } if(spfa(0)) printf("Yes\n"); else printf("No\n"); return 0; }