• AcWing1169 糖果(差分约数)


    转化成不等式后转化为最长路问题,另外多连0到他们的边后求一下最长路并判断是否有正环

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e5+10,M=3e5+10;
    int h[N],e[M],w[M],ne[M],idx;
    ll dis[N];
    int cnt[N];
    int st[N];
    int n,k;
    void add(int a,int b,int c){
        e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
    }
    bool spfa(){
        stack<int> q;
        st[0]=1;
        q.push(0);
        memset(dis,-0x3f,sizeof dis);
        dis[0]=0;
        while(q.size()){
            int t=q.top();
            q.pop();
            int i;
            st[t]=0;
            for(i=h[t];i!=-1;i=ne[i]){
                int j=e[i];
                if(dis[j]<dis[t]+w[i]){
                    dis[j]=dis[t]+w[i];
                    cnt[j]++;
                    if(cnt[j]>=n+1)
                    return false;
                    if(!st[j]){
                        q.push(j);
                        st[j]=1;
                    }
                }
            }
        }
        return true;
    }
    int main(){
        cin>>n>>k;
        int i;
        memset(h,-1,sizeof h);
        for(i=1;i<=k;i++){
            int a,b,x;
            scanf("%d%d%d",&x,&a,&b);
            if (x == 1) add(b, a, 0), add(a, b, 0);
            else if (x == 2) add(a, b, 1);
            else if (x == 3) add(b, a, 0);
            else if (x == 4) add(b, a, 1);
            else add(a, b, 0);
        }
        
        for (int i = 1; i <= n; i ++ ) add(0, i, 1);
        if(!spfa()){
            cout<<-1<<endl;
        }
        else{
            ll ans=0;
            for(i=1;i<=n;i++){
              //  cout<<dis[i]<<endl;
                ans+=dis[i];
            }
            
            cout<<ans<<endl;
        }
        
    }
    View Code
  • 相关阅读:
    用纯css画个三角形
    宝塔安装
    js判断浏览器版本
    JS打开url的几种方法
    java加密算法
    Mysql数据库多对多关系未建新表
    数据库唯一性约束异常插入处理
    HTML5中localStorage的使用
    软件设计师14-UML建模
    数据库设计流程
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12867934.html
Copyright © 2020-2023  润新知