FZU2181+poj2942(点双连通+判奇圈)
分析:我们对于那些相互不憎恨的人连边,将每次参加会议的所有人(不一定是全部人,只需人数>=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(点双连通+判奇圈)的更多相关文章
- poj 2942(点双连通+判奇圈)
题目链接:http://poj.org/problem?id=2942 思路:我们对于那些相互不憎恨的骑士连边,将每次参加会议的所有人(不一定是整个骑士团,只需人数>=3且为奇数)看做一个点双联 ...
- loj 1300( 边双联通 + 判奇圈 )
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27010 思路:首先Tarjan标记桥,然后对于dfs遍历整个图,我 ...
- fzu2181(点的双连通分量+求奇环)
求出每个点双连通分量,如果在一个点双连通分量中有奇环,则这个分量每个点都在一个奇环中. 关键是要知道怎么求点双连通分量以及点双连通的性质. fzu2181 http://acm.fzu.edu.cn ...
- 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会
先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...
- hdu 4598 Difference(奇圈判定+差分约束)
这是通化邀请赛的题,当时比赛的时候还完全没想法呢,看来这几个月的训练还是有效果的... 题意要求(1) |ai| < T for all i (2) (vi, vj) in E <=& ...
- POJ2942 Knights of the Round Table 点双连通分量,逆图,奇圈
题目链接: poj2942 题意: 有n个人,能够开多场圆桌会议 这n个人中,有m对人有仇视的关系,相互仇视的两人坐在相邻的位置 且每场圆桌会议的人数仅仅能为奇书 问有多少人不能參加 解题思路: 首先 ...
- 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)
[POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS Memory Limit: 65536K Total Su ...
- lightoj 1300 边双联通分量+交叉染色求奇圈
题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...
- 图的强连通&双连通
http://www.cnblogs.com/wenruo/p/4989425.html 强连通 强连通是指一个有向图中任意两点v1.v2间存在v1到v2的路径及v2到v1的路径. dfs遍历一个图, ...
随机推荐
- Oracle闪回flashback总结
1.说明: Ø 采用的技术. 使用的是多个技术. 1. 闪回日志 2. 回收站 3. 回滚段 无法使用回收站的操作 Drop table xxx purge; Drop ...
- 二维码闪电登录流程详解,附demo(2/2)
上篇文章,我们重点介绍了一下二维码登录的流程,以及每个“角色”要做的事情,下面我们重点分析TV角色所做的工作. TV主要完成二维码图片显示,以及websocket请求.下面重点说一下这两点. 1. B ...
- Android UI 学习 自定义的布局 平滑移动 VelocityTracker()
/** * Helper for tracking the velocity of touch events, for implementing * flinging and other such ...
- javascript 中 事件流和事件冒泡
一.事件流 是描述页面接受事件的顺序,IE 使用的是时间冒泡流;而Netscape的事件采用的是事件捕获流.1.事件冒泡JS 和 HTML是通过事件的方式实现交互.事件冒泡 开始元素,将事件逐级传递, ...
- 基于visual Studio2013解决C语言竞赛题之1091多项式
题目 解决代码及点评 /************************************************************************/ /* ...
- hive udaf 用maven打包运行create temporary function 时报错
用maven打包写好的jar,在放到hive中作暂时函数时报错. 错误信息例如以下: hive> create temporary function maxvalue as "com. ...
- Cocos2d-x学习笔记(5)
Cocos2d-x基本元素介绍: 1.CCDirector:大总管 这是控制游戏流程的主要组件,包含设定游戏呈现窗体.FPS显示.默认帧率上限.纹理颜色位宽等切换当前游戏场景.暂停或恢复场景执行.通过 ...
- 14.8.1 Enabling File Formats
14.8 InnoDB File-Format Management 14.8.1 Enabling File Formats 14.8.2 Verifying File Format Compati ...
- Fedora 问题总结第二季
该系列主要是记录自己使用fedora发现的问题. 1Linux Error: curses.h: No such file or directory Problem Solution sudo yum ...
- mysql基础: mysql列类型--字符串
mysql列类型:整型 http://blog.csdn.net/jk110333/article/details/9342283 mysql列类型--时间和日期 http://blog.csd ...