zoukankan      html  css  js  c++  java
  • luoguP4728 (2-SAT模板题)

    //推荐博客//

    // 2-SAT模板题
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<map>
    #include<queue>
    #include<vector>
    #include<string>
    #include<fstream>
    using namespace std;
    #define rep(i, a, n) for(int i = a; i <= n; ++ i);
    #define per(i, a, n) for(int i = n; i >= a; -- i);
    typedef long long ll;
    const int N = 5e6 + 105;
    const int mod = 1e9 + 7;
    const double Pi = acos(- 1.0);
    const ll INF = 1e18;
    const int G = 3, Gi = 332748118;
    ll qpow(ll a, ll b) { ll res = 1; while(b){ if(b & 1) res = (res * a) % mod; a = (a * a) % mod; b >>= 1;} return res; }
    ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
    // bool cmp(int a, int b){return a > b;}
    //
    
    int n, m;
    
    int head[N], cnt = 0;
    int low[N], dfn[N], Stack[N], Belong[N];
    int Index, top, scc;
    bool Instack[N];
    int to[N << 1], nxt[N << 1];
    
    void add(int u, int v){
        to[cnt] = v, nxt[cnt] = head[u], head[u] = cnt ++;
    }
    
    
    void Tarjan(int u){
        int v;
        low[u] = dfn[u] = ++ Index;
        Stack[top ++] = u;
        Instack[u] = true;
        for(int i = head[u]; i != -1; i = nxt[i]){
            v = to[i];
            if(!dfn[v]){
                Tarjan(v);
                if(low[u] > low[v] ) low[u] = low[v];
            }
            else if(Instack[v] && low[u] > dfn[v]) low[u] = dfn[v];
        }
        if(low[u] == dfn[u]){
            scc ++;
            do{
                v = Stack[-- top];
                Instack[v] = false;
                Belong[v] = scc;
            }while(v != u);
        }
    }
    
    
    void solve(){
        memset(dfn,0,sizeof(dfn));
        memset(Instack,false,sizeof(Instack));
        Index = top = scc = 0;
        for(int i = 1; i <= n * 2; ++ i)
            if(!dfn[i])
                Tarjan(i);
    }
    
    void init(){
        cnt = 0;
        memset(head,-1,sizeof(head));
    }
    
    
    int main()
    {
        init();
        scanf("%d%d",&n,&m);
        for(int i = 1; i <= m; ++ i){
            int x, tx, y, ty;
            scanf("%d%d%d%d",&x,&tx,&y,&ty);
            add(x + n * (tx & 1), y + n * (ty ^ 1));
            add(y + n * (ty & 1), x + n * (tx ^ 1));
        }
        solve();
        int flag = 0;
        for(int i = 1; i <= n; ++ i){
            if(Belong[i] == Belong[i + n]){
                flag = 1; break;
            }
        }
        if(flag) printf("IMPOSSIBLE
    ");
        else{
            printf("POSSIBLE
    ");
            for(int i = 1; i <= n; ++ i){
                if(Belong[i] < Belong[i + n]) printf("1");
                else printf("0");
                if(i == n) printf("
    ");
                else printf(" ");
            }
        }
        return 0;
    }
    
  • 相关阅读:
    react 常用组件整理
    react 问题记录二(侧重于state或者说server层操作)
    web前端常用小函数汇总
    vue 路由跳转四种方式 (带参数) 【转藏】
    微信小程序实用组件:省市区三级联动
    vue table组件显示一个图片

    520
    微信小程序,子页面调用父页面的函数和方法
    webstorm 右侧滚动条怎么设置颜色
  • 原文地址:https://www.cnblogs.com/A-sc/p/13629427.html
Copyright © 2011-2022 走看看