bzoj 2330

来源:互联网 发布:js判断是否为json格式 编辑:程序博客网 时间:2024/06/11 12:41

今天学习了一下差分约束系统,一堆证明之后得出的结论就是如果a-b>=c,就是从b到a连一条长度为c的边,然后跑最长路。

#include<queue>
#include<cstdio>
using namespace std;

#define ll long long
#define to e[i].v
#define inf 123456789
#define rep(i,a,b) for (int i=a;i<=b;++i)
#define N 100005
 
struct Node{
    int next,v,w;
}e[N*2];
 
int n,k,id,dist[N],head[N],vis[N],o[N];
ll ans;
 
void add(int u,int v,int w) {e[id].v=v;e[id].w=w;e[id].next=head[u];head[u]=id++;}
int max(int A,int B) {return A>B? A:B;}
int min(int A,int B) {return A>B? B:A;}
int read()
{
    int x=0,f=1;char ch=getchar();
    for (;ch>'9'||ch<'0';ch=getchar()) if (ch=='-') f=-1;
    for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    return x*f;
}
 
int Spfa()
{
    queue<int>S;rep(i,1,n) dist[i]=vis[i]=1,o[i]=0,S.push(i);
    while (!S.empty())
    {
        int u=S.front();S.pop();vis[u]=0;o[u]++;if (o[u]>n) return 0;
        for (int i=head[u];i;i=e[i].next)
            if (dist[u]+e[i].w>dist[to])
            {
                dist[to]=dist[u]+e[i].w;
                if (!vis[to]) {vis[to]=1;S.push(to);}
            }
    }
    return 1;
}
 
int main()
{
    n=read();k=read();id=1;
    rep(i,1,k)
    {
        int w=read(),u=read(),v=read();
        if (w==1) add(u,v,0),add(v,u,0);
        else if (w==2) add(u,v,1);
        else if (w==3) add(v,u,0);
        else if (w==4) add(v,u,1);
        else add(u,v,0);
    }
    if (!Spfa()) {puts("-1");return 0;}
    rep(i,1,n) ans=(ll)ans+(ll)dist[i];printf("%lld",ans);
    return 0;
}

0 0
原创粉丝点击