[SCOI2011]糖果

开开心心地写一道差分约束的题,但是不开心地发现只能拿90分???

Orz了一下dalao的题解,说有一个玄学的东西是最后加边的时候如果正的加就会T一个,反的就A了。

但是本弱反的加T了一个不同的,问问问???

然后加了个剪枝,加边的时候如果发现有要自己严格大于自己的熊孩子,就输出-1就行了,然后就A了。(面向 数据/标程 编程????

但实际上正解好像并不是这个。。。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=300005;
bool vis[N];int nxt[N],to[N],val[N],head[N],ecnt,n,K,dis[N],cnt[N];
void spfa() {
    vis[0]=1;queue<int>q;
    q.push(0);
    while(!q.empty()){
        int u=q.front();q.pop();vis[u]=0;
        for(int i=head[u];i;i=nxt[i]) {
            if(dis[to[i]]<dis[u]+val[i]) {
                dis[to[i]]=dis[u]+val[i];
        if(!vis[to[i]]) {vis[to[i]]=1,q.push(to[i]);cnt[to[i]]++;if(cnt[to[i]]==n-1) {puts("-1");exit(0);}}
            }
        }
    }
}
inline void add(int bg,int ed,int v) {nxt[++ecnt]=head[bg];to[ecnt]=ed;val[ecnt]=v;head[bg]=ecnt;}
int main() {
    scanf("%d%d",&n,&K);
    int a,b,c;
    while(K--) {
        scanf("%d%d%d",&a,&b,&c);
        if(a==1) {add(b,c,0),add(c,b,0);}
        else if(a==2) {if(b==c){puts("-1");return 0;}add(b,c,1);}
        else if(a==3) add(c,b,0);
        else if(a==4) add(c,b,1);
        else if(a==5) add(b,c,0);
    }
    for(int i=n;i;i--) add(0,i,1);
    vis[0]=1;
    spfa();long long ans=0;
    for(int i=1;i<=n;i++) ans+=dis[i];
    cout<<ans<<endl;
}
糖果
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9681990.html