#include<bits/stdc++.h>
using namespace std;
const int NN=20005;
const int INF=0x3f3f3f3f;
struct edge
{
int from,to,cost,next;
edge()
{
next=-1;
}
} edge[NN];
int n,m;
int d[NN];
int head[NN];
bool vis[NN];
int cnt=0;
bool flag;
void add(int u,int v,int w)
{
edge[cnt].from=u;
edge[cnt].to=v;
edge[cnt].cost=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void dfs_SPFA(int u)
{
vis[u]=1;
for(int i=head[u]; i; i=edge[i].next)
{
int v=edge[i].to;
if(d[v]>d[u]+edge[i].cost)
{
if(vis[v]!=0)
{
flag=1;
return;
}
d[v]=d[u]+edge[i].cost;
dfs_SPFA(v);
}
}
vis[u]=0;
return;
}
int main()
{
scanf("%d%d",&n,&m);//结点和路径
for(int i=0; i<m; i++)
{
int sign;
scanf("%d",&sign);
int a,b,c;
if(sign==1)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,-c);
}
else if(sign==2)
{
scanf("%d%d%d",&a,&b,&c);
add(b,a,c);
}
else
{
scanf("%d%d",&a,&b);
add(a,b,0);add(b,a,0);
}
}
memset(d,INF,sizeof(d));
for(int i=0; i<n; i++)
{
d[i]=0;
flag=0;
dfs_SPFA(i);
if(flag!=0)
{
printf("No\n");
return 0;
}
}
printf("Yes\n");
return 0;
}
p1993——差分约束系统(dfs的SPFA)
最新推荐文章于 2020-07-30 17:24:29 发布