zoukankan      html  css  js  c++  java
  • BZOJ2215 : [Poi2011]Conspiracy

    考虑构造一组可行解,把每个点拆成两个点x0,x1,x0表示后勤组织,x1表示同谋者。

    若x与y认识,则x1向y0连边。

    若x与y不认识,则x0向y1连边。

    如此求出一组2-SAT的可行解,如果无解则答案为0。

    若有解,那么最多只能把一个人从后勤组织改为同谋者,也最多只能把一个人从同谋者改为后勤组织。

    于是预处理出若改变每个人的状态,他与另一个集合里哪一个人冲突。

    然后枚举要改变的人,统计答案即可。

    时间复杂度$O(n^2)$。

    #include<cstdio>
    const int N=5010,M=10010;
    int n,i,j,x,q[M],t,ans,c[2],a[2][N],f[2][N];bool g[N][N],v[M];
    inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
    bool dfs(int x){
      if(v[x>n?x-n:x+n])return 0;
      if(v[x])return 1;
      v[q[++t]=x]=1;
      if(x>n){for(int i=1;i<=n;i++)if(i!=x-n)if(g[x-n][i])if(!dfs(i))return 0;}
      else{for(int i=1;i<=n;i++)if(i!=x)if(!g[x][i])if(!dfs(i+n))return 0;}
      return 1;
    }
    bool solve(){
      for(i=1;i<=n;i++)if(!v[i]&&!v[i+n]){
        t=0;
        if(!dfs(i)){
          while(t)v[q[t--]]=0;
          if(!dfs(i+n))return 0;
        }
      }
      return 1;
    }
    int main(){
      read(n);
      for(i=1;i<=n;i++)for(read(j);j--;g[i][x]=1)read(x);
      if(!solve())return puts("0"),0;
      for(i=1;i<=n;i++)v[i]^=1,a[v[i]][++c[v[i]]]=i;
      for(i=1;i<=c[0];i++)for(x=a[0][i],j=1;j<=c[1];j++)if(g[x][a[1][j]]){
        if(!f[0][i])f[0][i]=j;else{f[0][i]=-1;break;}
      }
      for(i=1;i<=c[1];i++)for(x=a[1][i],j=1;j<=c[0];j++)if(!g[x][a[0][j]]){
        if(!f[1][i])f[1][i]=j;else{f[1][i]=-1;break;}
      }
      if(c[0]>1)for(i=1;i<=c[0];i++)if(!f[0][i])ans++;
      if(c[1]>1)for(i=1;i<=c[1];i++)if(!f[1][i])ans++;
      if(c[0]&&c[1])for(ans++,i=1;i<=c[0];i++)for(j=1;j<=c[1];j++){
        if((!f[0][i]||f[0][i]==j)&&(!f[1][j]||f[1][j]==i))ans++;
      }
      return printf("%d",ans),0;
    }
    

      

  • 相关阅读:
    LeetCode "Super Ugly Number" !
    LeetCode "Count of Smaller Number After Self"
    LeetCode "Binary Tree Vertical Order"
    LeetCode "Sparse Matrix Multiplication"
    LeetCode "Minimum Height Tree" !!
    HackerRank "The Indian Job"
    HackerRank "Poisonous Plants"
    HackerRank "Kundu and Tree" !!
    LeetCode "Best Time to Buy and Sell Stock with Cooldown" !
    HackerRank "AND xor OR"
  • 原文地址:https://www.cnblogs.com/clrs97/p/4706162.html
Copyright © 2011-2022 走看看