差分约束不是有一个性质:
x=(x1,x2,x3,...,xn)是不等式的一个解。设d为任意常数,则x+d=(x1+d,x2+d,x3+d,...,xn+d)也是该不等式的一个解。
基于这个性质。我用编号为 3 的数据对可行解进行检验。WA两个点。90分。
(之后看了题解,知道编号为 3 的数据应该怎么用了,但是这个疑问没有解决。)
#include <bits/stdc++.h>
#define MAXN 100000
#define INF 0x3f3f3f3f
using namespace std;
int cnt=0,adj[MAXN];
int n,m;
int dis[MAXN],vis[MAXN],num[MAXN];
queue < int > q;
struct EDGE
{
int to,nxt,val;
} e[MAXN];
struct node
{
int x,y;
} jud[MAXN]; int tot=1;
void addedge(int u,int v,int w)
{
e[++cnt].to=v; e[cnt].nxt=adj[u]; e[cnt].val=w; adj[u]=cnt;
}
bool SPFA()
{
for(int i=1;i<=n;++i)
{
addedge(0,i,0);dis[i]=INF;
}
q.push(0); dis[0]=0; vis[0]=1; ++num[0];
while(!q.empty())
{
int u=q.front(); q.pop(); vis[u]=0;
for(int i=adj[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(dis[v]>dis[u]+e[i].val)
{
dis[v]=dis[u]+e[i].val;
if(!vis[v])
{
++num[v];
if(num[v]>n) return 0;
vis[v]=1; q.push(v);
}
}
}
}
return 1;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
int flag,u,v,w; scanf("%d",&flag);
if(flag==1)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,-w);
}
else if(flag==2)
{
scanf("%d%d%d",&u,&v,&w);
addedge(v,u,w);
}
else
{
scanf("%d%d",&u,&v);
jud[++tot].x=u;
jud[tot].y=v;
}
}
if(!SPFA()) printf("No");
else
{
int i;
for(i=1;i<=tot;++i)
if(dis[ jud[i].x ] != dis[ jud[i].y ])
break;
if(i==tot+1)
printf("Yes");
else
printf("NO");
}
return 0;
}
谢谢谢谢