• poj2942 Knights of the Round Table[点双+二分图染色]


    首先转化条件,把无仇恨的人连边,然后转化成了求有哪些点不在任何一个奇环中。

    一个奇环肯定是一个点双,所以想到处理出所有点双,但是也可能有的点双是一个偶环,有的可能是偶环和奇环混杂,不好判。

    考察奇环性质。发现如果一个点双中只要存在一个奇环,那么任何一个点都会在至少一个奇环之中,这一点可以通过画图说明,也就是不管这些环是交错的还是嵌套的,通过奇偶性推算都可以说明这一点。。

    于是只要看每个点双有没有奇环即可。提到奇环,联想到二分图,所以只要二分图染色一下看合不合法即可。

    不过本人在这个染色的地方卡了一下。。因为想到菊花图的数据(就是每次都在根处把所有边都查一遍)会不会被卡掉。。不过后来发现自己傻*了。。我在意的地方是在割点处会有遍历到属于其他点双的边,不过,由于割点最多$n$个,边由于最多连向$n$个点,所以$O(n^2)$复杂度,$n=1000$可以的。。但是这个染色的复杂度真心感觉好难受啊。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #define mst(x) memset(x,0,sizeof x)
     8 #define dbg(x) cerr << #x << " = " << x <<endl
     9 #define dbg2(x,y) cerr<< #x <<" = "<< x <<"  "<< #y <<" = "<< y <<endl
    10 using namespace std;
    11 typedef long long ll;
    12 typedef double db;
    13 typedef pair<int,int> pii;
    14 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
    15 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
    16 template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,1):0;}
    17 template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,1):0;}
    18 template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
    19 template<typename T>inline T read(T&x){
    20     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c=='-')f=1;
    21     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
    22 }
    23 const int N=1000+7,M=1e6+7;
    24 struct thxorz{
    25     int head[N],to[M<<1],nxt[M<<1],tot;
    26     inline void add(int x,int y){
    27         to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
    28         to[++tot]=x,nxt[tot]=head[y],head[y]=tot;
    29     }
    30     inline void clear(){mst(head),tot=1;}
    31 }G;
    32 int hate[N][N];
    33 int n,m,ans;
    34 #define y G.to[j]
    35 vector<int> dcc[N];
    36 int dc,dfn[N],low[N],tim,stk[N],Top,rt;
    37 void tarjan(int x){
    38     dfn[x]=low[x]=++tim;
    39     if(rt==x&&!G.head[x]){++dc;dcc[dc].push_back(x);return;}
    40     for(register int j=G.head[x];j;j=G.nxt[j])
    41         if(!dfn[y]){
    42             stk[++Top]=y,tarjan(y),MIN(low[x],low[y]);
    43             if(low[y]==dfn[x]){
    44                 int tmp;++dc;
    45                 do tmp=stk[Top--],dcc[dc].push_back(tmp);while(tmp^y);
    46                 dcc[dc].push_back(x);
    47             }
    48         }
    49         else MIN(low[x],dfn[y]);
    50 }
    51 int cl[N],tag[N],ban[N],flag,kai;
    52 void dfs(int x,int clr){//dbg2(x,clr);
    53     cl[x]=clr;
    54     for(register int j=G.head[x];j&&!flag;j=G.nxt[j])if(ban[y]==kai){
    55         if(!cl[y])dfs(y,3-clr);
    56         else if(cl[y]==clr){flag=1;return;}
    57     }
    58 }
    59 #undef y
    60 inline void Clear(){G.clear();mst(hate),mst(tag),mst(dfn),mst(ban),mst(cl);dc=tim=ans=0;}
    61 int main(){//freopen("test.in","r",stdin);freopen("test.ans","w",stdout);
    62     while(read(n),read(m),n||m){
    63         Clear();
    64         for(register int i=1,x,y;i<=m;++i)read(x),read(y),hate[x][y]=hate[y][x]=1;
    65         for(register int i=1;i<=n;++i)for(register int j=i+1;j<=n;++j)if(!hate[i][j])G.add(i,j);
    66         for(register int i=1;i<=n;++i)if(!dfn[i])rt=i,Top=0,tarjan(i);
    67         for(register int i=1;i<=dc;++i){
    68         //    if(dcc[i].size()<3)continue;<----will skip the line75--clear
    69             for(register int j=0;j<dcc[i].size();++j)cl[dcc[i][j]]=0,ban[dcc[i][j]]=i;
    70             flag=0,kai=i,dfs(dcc[i][0],1);
    71             if(flag)for(register int j=0;j<dcc[i].size();++j)tag[dcc[i][j]]=1;
    72             dcc[i].clear();
    73         }
    74         for(register int i=1;i<=n;++i)if(!tag[i])++ans;
    75         printf("%d
    ",ans);
    76     }
    77     return 0;
    78 }
    View Code
  • 相关阅读:
    正则表达式学习
    由#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 浅出
    Xcode调试
    多线程GCD 完整版
    [不定时更新-(进阶必看)我常去逛的iOS干货文章、blog等
    老程序自动安装更新程序
    fragment 学习
    Android常用的颜色列表 color.xml
    android的padding和margin的区别
    android shape的使用
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/11750332.html
Copyright © 2020-2023  润新知