bzoj3436(差分约束系统)

来源:互联网 发布:花千骨天羽进阶数据 编辑:程序博客网 时间:2024/06/08 06:06


递归版的spfa,不了解其性质

#include<cstdio>#include<cmath>#include<cstdlib>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int inf=0x3f3f3f3f;const int N=50005;int n,m;int head[50005],tot,dis[N],tt[N],flag;struct aa{int to,pre,dis;}edge[500006];void addedge(int x,int y,int z){edge[++tot].to=y;edge[tot].pre=head[x];edge[tot].dis=z;head[x]=tot;}bool b[N];void spfa(int u){if (flag) return ;b[u]=true;for (int i=head[u];i;i=edge[i].pre)if (dis[edge[i].to]>dis[u]+edge[i].dis){int v=edge[i].to;dis[v]=dis[u]+edge[i].dis;if (b[v]) {flag=1;return ;}spfa(v);}b[u]=false;}int main(){scanf("%d%d",&n,&m);int p,x,y,z;for (int i=1;i<=m;i++){scanf("%d",&p);switch(p){case 1:scanf("%d%d%d",&x,&y,&z);addedge(x,y,-z);break;case 2:scanf("%d%d%d",&x,&y,&z);addedge(y,x,z);break;case 3:scanf("%d%d",&x,&y);addedge(x,y,0);addedge(y,x,0);break;}}memset(dis,inf,sizeof(dis));for (int i=1;i<=n;i++){dis[i]=0;spfa(i);}if (!flag) printf("Yes");else printf("No");return 0;}


0 0