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

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

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

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

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

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define mst(x) memset(x,0,sizeof x)
#define dbg(x) cerr << #x << " = " << x <<endl
#define dbg2(x,y) cerr<< #x <<" = "<< x <<" "<< #y <<" = "<< y <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+,M=1e6+;
struct thxorz{
int head[N],to[M<<],nxt[M<<],tot;
inline void add(int x,int y){
to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
to[++tot]=x,nxt[tot]=head[y],head[y]=tot;
}
inline void clear(){mst(head),tot=;}
}G;
int hate[N][N];
int n,m,ans;
#define y G.to[j]
vector<int> dcc[N];
int dc,dfn[N],low[N],tim,stk[N],Top,rt;
void tarjan(int x){
dfn[x]=low[x]=++tim;
if(rt==x&&!G.head[x]){++dc;dcc[dc].push_back(x);return;}
for(register int j=G.head[x];j;j=G.nxt[j])
if(!dfn[y]){
stk[++Top]=y,tarjan(y),MIN(low[x],low[y]);
if(low[y]==dfn[x]){
int tmp;++dc;
do tmp=stk[Top--],dcc[dc].push_back(tmp);while(tmp^y);
dcc[dc].push_back(x);
}
}
else MIN(low[x],dfn[y]);
}
int cl[N],tag[N],ban[N],flag,kai;
void dfs(int x,int clr){//dbg2(x,clr);
cl[x]=clr;
for(register int j=G.head[x];j&&!flag;j=G.nxt[j])if(ban[y]==kai){
if(!cl[y])dfs(y,-clr);
else if(cl[y]==clr){flag=;return;}
}
}
#undef y
inline void Clear(){G.clear();mst(hate),mst(tag),mst(dfn),mst(ban),mst(cl);dc=tim=ans=;}
int main(){//freopen("test.in","r",stdin);freopen("test.ans","w",stdout);
while(read(n),read(m),n||m){
Clear();
for(register int i=,x,y;i<=m;++i)read(x),read(y),hate[x][y]=hate[y][x]=;
for(register int i=;i<=n;++i)for(register int j=i+;j<=n;++j)if(!hate[i][j])G.add(i,j);
for(register int i=;i<=n;++i)if(!dfn[i])rt=i,Top=,tarjan(i);
for(register int i=;i<=dc;++i){
// if(dcc[i].size()<3)continue;<----will skip the line75--clear
for(register int j=;j<dcc[i].size();++j)cl[dcc[i][j]]=,ban[dcc[i][j]]=i;
flag=,kai=i,dfs(dcc[i][],);
if(flag)for(register int j=;j<dcc[i].size();++j)tag[dcc[i][j]]=;
dcc[i].clear();
}
for(register int i=;i<=n;++i)if(!tag[i])++ans;
printf("%d\n",ans);
}
return ;
}

poj2942 Knights of the Round Table[点双+二分图染色]的更多相关文章

  1. [POJ2942]Knights of the Round Table(点双+二分图判定——染色法)

    建补图,是两个不仇恨的骑士连边,如果有环,则可以凑成一桌和谐的打麻将 不能直接缩点,因为直接缩点求的是连通分量,点双缩点只是把环缩起来 普通缩点                             ...

  2. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 12439   Acce ...

  3. POJ2942 Knights of the Round Table 点双连通分量,逆图,奇圈

    题目链接: poj2942 题意: 有n个人,能够开多场圆桌会议 这n个人中,有m对人有仇视的关系,相互仇视的两人坐在相邻的位置 且每场圆桌会议的人数仅仅能为奇书 问有多少人不能參加 解题思路: 首先 ...

  4. POJ2942 Knights of the Round Table 点双连通分量 二分图判定

    题目大意 有N个骑士,给出某些骑士之间的仇恨关系,每次开会时会选一些骑士开,骑士们会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件:1.任意相互憎恨的两个骑士不能相邻.2.开会人数为大于2的奇 ...

  5. [POJ2942]:Knights of the Round Table(塔尖+二分图染色法)

    题目传送门 题目描述 亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: .相互憎恨的两个骑士不能坐在直接相邻的 ...

  6. 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)

    [POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS   Memory Limit: 65536K Total Su ...

  7. 【POJ】2942 Knights of the Round Table(双连通分量)

    http://poj.org/problem?id=2942 各种逗.... 翻译白书上有:看了白书和网上的标程,学习了..orz. 双连通分量就是先找出割点,然后用个栈在找出割点前维护子树,最后如果 ...

  8. 「题解」:[POJ2942]Knights of the Round Table

    问题 E: Knights of the Round Table 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 作为一名骑士是一个非常有吸引力的职业:寻找圣杯,拯救遇难的少女,与 ...

  9. POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】

    LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...

随机推荐

  1. 教程2:如何找到内存泄漏dotmemory

    在本教程中,我们将看到如何使用dotmemory定位和固定在你的应用程序的内存泄漏.但在开始之前,让我们在一个内存泄漏是一致的. 内存泄漏是什么? 根据维基百科,内存泄漏是由于不正确的内存管理时,”一 ...

  2. MemCache在.NET中使用Memcached.ClientLibrary详解

    本文说明:memcached分布式缓存的负载均衡配置比例,数据压缩,socket的详细配置等,以及在.net中的常用方法 首先下载客户端的3个dll,ICSharpCode.SharpZipLib.d ...

  3. 关于Angular+ngx-perfect-scrollbar自定义各大浏览器滚动条样式的解决方法

    资料: http://manos.malihu.gr/jquery-custom-content-scroller/  (此项是结合Jquery使用的,在此并未采用) https://www.npmj ...

  4. 数据结构——关于任一二叉树n0=n2+1的证明

    对于任一二叉树,若度为2的结点有n2个,则叶子结点数必为n2+1 证明: 假设该二叉树总共有n个结点(n=n0+n1+n2),则该二叉树总共会有n-1条边,度为2的结点会延伸出两条边, 同理,度为1的 ...

  5. 【转】转载一篇优质的讲解epoll模型的文章

    从事服务端开发,少不了要接触网络编程.Epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,Nginx.Redis.Skynet 和大部分游戏服务器都使用到这一多路复用技术. Epoll ...

  6. Solr 8.2 使用指南

    1 Solr简介 1.1 Solr是什么 Solr是一个基于全文检索的企业级应用服务器.可以输入一段文字,通过分词检索数据.它是单独的服务,部署在 tomcat. 1.2 为什么需要Solr 问题:我 ...

  7. sysbench配置使用

    unzip sysbench-0.5.zipcd sysbench-0.5 #####sysbench下载:https://codeload.github.com/akopytov/sysbench/ ...

  8. Windows安全日志

    在运行中输入:eventvwr.msc,即可打开事件日志. 登录类型 描述 2 互动(键盘和屏幕的登录系统) 3 网络(即连接到共享文件夹从其他地方在这台电脑上网络) 4 批处理(即计划任务) 5 服 ...

  9. 【转】Entity Framework 6 Code First 实践系列(1):实体类配置-根据依赖配置关系和关联

    本文转自:http://www.cnblogs.com/easygame/p/3622893.html EF实体类的配置可以使用数据注释或Fluent API两种方式配置,Fluent API配置的关 ...

  10. SpringBoot 中aop整合方法执行日志

    今天事情不多, 处理完手中的事边想着捣鼓一下AOP, 着手开始写才发现, 多久不用, 自己已经忘得差不多了, 捣鼓半天之后, 慢慢整出这个小demo,以便于以后查阅回顾 1 .先创建一个注解, 用来作 ...