zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    PAT 甲级 1113 Integer Set Partition
    简单 dp
    #Leetcode# 707. Design Linked List
    #Leetcode# 817. Linked List Components
    #Leetcode# 268. Missing Number
    #Leetcode# 328. Odd Even Linked List
    #Leetcode# 445. Add Two Numbers II
    jzoj 1252. 天平
    2019.01.26【NOIP提高组】模拟 B 组 总结
    【NOIP2011DAY2】计算系数
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9681990.html
Copyright © 2011-2022 走看看