• lightoj 1251 (Two_Sat)


    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #include<vector>
    using namespace std;
    
    const int maxn = 20050;
    const int INF  = 0x3f3f3f;
    
    int n,m;
    char a[maxn][2];
    int b[maxn][2];
    
    struct TwoSat{
        int n;
        vector<int>  G[maxn*2];
        bool mark[2*maxn];
        int s[2*maxn],cnt;
    
        void init(int n){
            this->n = n;
            memset(mark,0,sizeof(mark));
            for(int i=0;i<=2*n;i++)  G[i].clear();
        }
    
        void add_clause(int u,int uval,int v,int vval){
            u = u*2 + uval;    //u,v有矛盾;
            v = v*2 + vval;
            G[u].push_back(v^1);
            G[v].push_back(u^1);
        }
    
        bool dfs(int u){
            if(mark[u^1])    return false;
            if(mark[u])      return true;
            mark[u] = true;
            s[cnt++] = u;  //记录你所选择的路径;
            for(int i=0;i<G[u].size();i++ ){
               if( !dfs(G[u][i]) )    return false;
            }
            return true;
        }
    
        bool solve(){
            for(int i=0;i<2*n;i+=2){
                if(!mark[i] && !mark[i+1]){
                    cnt = 0;
                    if(!dfs(i)){
                        while(cnt > 0)  mark[s[--cnt]] = false;
                        if(!dfs(i+1))  return false;
                    }
                }
            }
            return true;
        }
        void print(){
            int ans[maxn],pv = 0;
            for(int i=0;i<2*n;i+=2){
                if(mark[i] && a[i/2][0] == '+'){
                    ans[pv++] = b[i/2][0];
                }
                else  if(mark[i+1] && a[i/2][1] == '+'){
                    ans[pv++] = b[i/2][1];
                }
            }
            sort(ans,ans+pv);
            int num = unique(ans,ans+pv)  - ans;
            printf("%d",num);
            for(int i=0;i<num;i++)  printf(" %d",ans[i]);
            printf("
    ");
        }
    
    }solver;
    
    int main()
    {
        //freopen("E:\acm\input.txt","r",stdin);
        int T;
        cin>>T;
        for(int t=1;t<=T;t++){
            scanf("%d %d",&n,&m);
            solver.init(n);
            vector<int> p1[8008],p2[8008],n1[8008],n2[8008];
            for(int i=0;i<n;i++){
                int temp;
                scanf("%c%c%d%c%c%d",&temp,&a[i][0],&b[i][0],&temp,&a[i][1],&b[i][1]);
                if(a[i][0] == '+'){
                    p1[b[i][0]].push_back(i);
                    p2[b[i][0]].push_back(0);
                }
                else{
                    n1[b[i][0]].push_back(i);
                    n2[b[i][0]].push_back(0);
                }
                if(a[i][1] == '+'){
                    p1[b[i][1]].push_back(i);
                    p2[b[i][1]].push_back(1);
                }
                else{
                    n1[b[i][1]].push_back(i);
                    n2[b[i][1]].push_back(1);
                }
            }
            for(int i=1;i<=m;i++){
                for(int j=0;j<p1[i].size();j++)
                   for(int k=0;k<n1[i].size();k++){
                      solver.add_clause(p1[i][j],p2[i][j],n1[i][k],n2[i][k]);
                }
            }
            if(solver.solve()){
                printf("Case %d: Yes
    ",t);
                solver.print();
            }
            else       printf("Case %d: No
    ",t);
        }
    }
    View Code

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1251

  • 相关阅读:
    一种无法被Dump的jar包加密保护解决方案
    基于设备指纹零感验证系统
    IOS防作弊产品技术原理分析
    某移动端防作弊产品技术原理浅析与个人方案构想
    web安全防御之RASP技术
    Linux漏洞分析入门笔记-Off-By-One(栈)
    smb中继学习
    Dedecms sp2 5.7 后台getshell审计
    phpmyadmin后台代码执行分析复现
    静态恶意代码逃逸-学习一
  • 原文地址:https://www.cnblogs.com/acmdeweilai/p/3264253.html
Copyright © 2020-2023  润新知