分析:我们对于那些相互不憎恨的人连边,将每次参加会议的所有人(不一定是全部人,只需人数>=3且为奇数)看做一个点双联通分量,那么每个点都至少有两个点与他相邻。即需要保证双联通分量中存在奇圈。至于如何判奇圈,这里有一个性质:一个图是二分图当且仅当图中不存在奇圈。至于如何判断一个图是否是二分图,可以采用交替染色的方式判断。

传送门:FZU 2181 快来买肉松饼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
#define MAXN 1005 struct Edge{
int v,next;
}edge[MAXN*MAXN*]; int n,m,NE,ans;
int head[MAXN];
bool hate[MAXN][MAXN];
void Insert(int u,int v)
{
NE++;
edge[NE].v=v;
edge[NE].next=head[u];
head[u]=NE;
} void Build()
{
int a,b;
memset(hate,false,sizeof(hate));
while(m--){
scanf("%d%d",&a,&b);
hate[a][b]=hate[b][a]=true;
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
if(!hate[i][j]){
Insert(i,j);
Insert(j,i);
}
}
}
} int cnt,_count;
int low[MAXN],dfn[MAXN];
int block[MAXN];
int color[MAXN];
bool mark[MAXN];
int num[MAXN];
bool is_expelled[MAXN];
stack<int>S;
bool Judge(int u,int state)
{
color[u]=state;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(block[v]==_count){
if(color[v]&&color[u]==color[v])
return true;
if(!color[v]&&Judge(v,-state))
return true;
}
}
return false;
}
void Tarjan(int u,int father)
{
int flag=;
low[u]=dfn[u]=++cnt;
mark[u]=true;
S.push(u);
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(v==father&&!flag){ flag=;continue; }
if(dfn[v]==){
Tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
int x,tmp=;
_count++;
do{
x=S.top();
S.pop();
mark[x]=false;
block[x]=_count;
num[tmp++]=x;
}while(x!=v);//割点u可能属于多个连通块,因此不能出栈
num[tmp++]=u;
memset(color,,sizeof(color));
if(tmp>=&&Judge(u,)){
while(tmp>){
is_expelled[num[--tmp]]=false;
}
}
}
}else if(mark[v]){
low[u]=min(low[u],dfn[v]);
}
}
}
void init()
{
cnt=_count=;NE=;
memset(head,,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(block,,sizeof(block));
memset(is_expelled,true,sizeof(is_expelled));
memset(mark,false,sizeof(mark));
}
int main()
{
int T,k;
scanf("%d",&T);
while(T--){
// if(n==0&&m==0)break;
scanf("%d%d%d",&n,&m,&k);
init();
Build();
for(int i=;i<=n;i++)if(dfn[i]==)Tarjan(i,-);
ans=;
for(int i=;i<=n;i++)if(!is_expelled[i])ans++;
if(ans>=k)puts("Let's Fire!");
else puts("What a Pity.");
//printf("%d\n",ans);
}
return ;
}

传送门:poj 2942 Knights of the Round Table

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
#define MAXN 1005 struct Edge{
int v,next;
}edge[MAXN*MAXN*]; int n,m,NE,ans;
int head[MAXN];
bool hate[MAXN][MAXN];
void Insert(int u,int v)
{
NE++;
edge[NE].v=v;
edge[NE].next=head[u];
head[u]=NE;
} void Build()
{
int a,b;
memset(hate,false,sizeof(hate));
while(m--){
scanf("%d%d",&a,&b);
hate[a][b]=hate[b][a]=true;
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
if(!hate[i][j]){
Insert(i,j);
Insert(j,i);
}
}
}
} int cnt,_count;
int low[MAXN],dfn[MAXN];
int block[MAXN];
int color[MAXN];
bool mark[MAXN];
int num[MAXN];
bool is_expelled[MAXN];
stack<int>S;
bool Judge(int u,int state)
{
color[u]=state;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(block[v]==_count){
if(color[v]&&color[u]==color[v])
return true;
if(!color[v]&&Judge(v,-state))
return true;
}
}
return false;
}
void Tarjan(int u,int father)
{
int flag=;
low[u]=dfn[u]=++cnt;
mark[u]=true;
S.push(u);
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(v==father&&!flag){ flag=;continue; }
if(dfn[v]==){
Tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
int x,tmp=;
_count++;
do{
x=S.top();
S.pop();
mark[x]=false;
block[x]=_count;
num[tmp++]=x;
}while(x!=v);//割点u可能属于多个连通块,因此不能出栈
num[tmp++]=u;
memset(color,,sizeof(color));
if(tmp>=&&Judge(u,)){
while(tmp>){
is_expelled[num[--tmp]]=false;
}
}
}
}else if(mark[v]){
low[u]=min(low[u],dfn[v]);
}
}
}
void init()
{
cnt=_count=;NE=;
memset(head,,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(block,,sizeof(block));
memset(is_expelled,true,sizeof(is_expelled));
memset(mark,false,sizeof(mark));
}
int main()
{
while(scanf("%d%d",&n,&m)>){
if(n==&&m==)break;
init();
Build();
for(int i=;i<=n;i++)if(dfn[i]==)Tarjan(i,-);
ans=;
for(int i=;i<=n;i++)if(is_expelled[i])ans++;
printf("%d\n",ans);
}
return ;
}

FZU2181+poj2942(点双连通+判奇圈)的更多相关文章

  1. poj 2942(点双连通+判奇圈)

    题目链接:http://poj.org/problem?id=2942 思路:我们对于那些相互不憎恨的骑士连边,将每次参加会议的所有人(不一定是整个骑士团,只需人数>=3且为奇数)看做一个点双联 ...

  2. loj 1300( 边双联通 + 判奇圈 )

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27010 思路:首先Tarjan标记桥,然后对于dfs遍历整个图,我 ...

  3. fzu2181(点的双连通分量+求奇环)

    求出每个点双连通分量,如果在一个点双连通分量中有奇环,则这个分量每个点都在一个奇环中.  关键是要知道怎么求点双连通分量以及点双连通的性质. fzu2181 http://acm.fzu.edu.cn ...

  4. 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会

    先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...

  5. hdu 4598 Difference(奇圈判定+差分约束)

    这是通化邀请赛的题,当时比赛的时候还完全没想法呢,看来这几个月的训练还是有效果的... 题意要求(1) |ai| < T for all i   (2) (vi, vj) in E <=& ...

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

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

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

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

  8. lightoj 1300 边双联通分量+交叉染色求奇圈

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...

  9. 图的强连通&双连通

    http://www.cnblogs.com/wenruo/p/4989425.html 强连通 强连通是指一个有向图中任意两点v1.v2间存在v1到v2的路径及v2到v1的路径. dfs遍历一个图, ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之1046矩阵计算

       题目 解决代码及点评 /************************************************************************/ /* 46 ...

  2. 关于wxFileSystemWatcher输出文件名的解决方法

    本文针对的wxWidgets版本: 2.9.4, 2.9.5,其他版本未作测试. 如果要使用 wxFileSystemWatcher 并且让其产生的wxFileSystemWatcherEvent 事 ...

  3. 【C语言】在两个数成对出现的数组中找到一个单独的数。

    //在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) ...

  4. 融云(找到“每个App都有沟通的需求”的细分市场)

    近日,国内著名App驾考宝典和融云达成合作,为应用增加IM功能,实现亿级用户之间聊天.消息一出,IM(即时通讯)领域的大佬,同时也是个上线不到两岁的新生力量,再次引发了行业的关注. 对业内人士而言,即 ...

  5. thinkphp 设置跨域请求

    场景:我的本地网页服务器无法访问本地的接口服务器接口提示一下错误:大致意思是:是一个跨域请求我的没有访问该地址的权限(接口服务器采用的是PHP编写) XMLHttpRequest cannot loa ...

  6. Head First PHP &amp;MySQL学习笔记

      近期一段时间在学习PHP,买了<Head First PHP&MySQL>中文版这本书,之前买过<Head First设计模式>,感觉这系列的书籍整体来说非常不错. ...

  7. 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...

  8. 恭喜我开通了CSDN博客

    准备在这里写点东西,记录我的学习过程....

  9. C嵌入汇编

    概述:linux内核源码中,有很多C语言中嵌入了汇编语句,如何理解这些汇编语句,对理解内核有很重要的作用. 具有输入和输出参数的嵌入式汇编语句的基本格式为: asm("汇编语句" ...

  10. 阅读代码分析工具Understand 2.0试用

    Understand 2.0是一款源码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实能够大大提高代码阅读效率. 因为Understand功能十分强大,本文不可能详尽地介绍它的全部功能,所 ...