loj 1300( 边双联通 + 判奇圈 )
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27010
思路:首先Tarjan标记桥,然后对于dfs遍历整个图,我们可以得出一个简单的结论,就是如果一个双连通分量中存在奇圈,那么这个双连通分量中的所有点都可行,于是我们可以dfs染色判奇圈。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 22222 struct Edge{
int v,next;
}edge[MAXN<<]; int n,m,NE;
int head[MAXN]; void Insert(int u,int v)
{
edge[NE].v=v;
edge[NE].next=head[u];
head[u]=NE++;
} int low[MAXN],dfn[MAXN],cnt;
bool bridge[MAXN<<];
bool mark[MAXN]; void Tarjan(int u,int father)
{
low[u]=dfn[u]=++cnt;
mark[u]=true;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(v==father)continue;
if(dfn[v]==){
Tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]){
bridge[i]=bridge[i^]=true;
}
}else if(mark[v]){
low[u]=min(low[u],dfn[v]);
}
}
} int flag,ans;
int color[MAXN]; void dfs(int u,int state)
{
cnt++;
color[u]=state;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(bridge[i])continue;
if(color[v]&&color[u]==color[v]){
flag=;
}else if(color[v]==){
dfs(v,-state);
}
}
} int main()
{
int _case,u,v,t=;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
NE=;
memset(head,-,sizeof(head));
while(m--){
scanf("%d%d",&u,&v);
Insert(u,v);
Insert(v,u);
}
cnt=;
memset(mark,false,sizeof(mark));
memset(dfn,,sizeof(dfn));
memset(bridge,false,sizeof(bridge));
for(int i=;i<n;i++)if(dfn[i]==)Tarjan(i,i);
memset(color,,sizeof(color));
ans=;
for(int i=;i<n;i++){
if(color[i]==){
flag=;
cnt=;
dfs(i,);
if(flag)ans+=cnt;
}
}
printf("Case %d: %d\n",t++,ans);
}
return ;
}
loj 1300( 边双联通 + 判奇圈 )的更多相关文章
- FZU2181+poj2942(点双连通+判奇圈)
分析:我们对于那些相互不憎恨的人连边,将每次参加会议的所有人(不一定是全部人,只需人数>=3且为奇数)看做一个点双联通分量,那么每个点都至少有两个点与他相邻.即需要保证双联通分量中存在奇圈.至于 ...
- poj 2942(点双连通+判奇圈)
题目链接:http://poj.org/problem?id=2942 思路:我们对于那些相互不憎恨的骑士连边,将每次参加会议的所有人(不一定是整个骑士团,只需人数>=3且为奇数)看做一个点双联 ...
- lightoj 1300 边双联通分量+交叉染色求奇圈
题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...
- POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】
LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...
- hdu 4598 Difference(奇圈判定+差分约束)
这是通化邀请赛的题,当时比赛的时候还完全没想法呢,看来这几个月的训练还是有效果的... 题意要求(1) |ai| < T for all i (2) (vi, vj) in E <=& ...
- 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)
[POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS Memory Limit: 65536K Total Su ...
- poj2942(双联通分量,交叉染色判二分图)
题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先 ...
- POJ2942 Knights of the Round Table 点双连通分量,逆图,奇圈
题目链接: poj2942 题意: 有n个人,能够开多场圆桌会议 这n个人中,有m对人有仇视的关系,相互仇视的两人坐在相邻的位置 且每场圆桌会议的人数仅仅能为奇书 问有多少人不能參加 解题思路: 首先 ...
- 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)
layout: post title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色) author: "luowentaoaa" catalog: tru ...
随机推荐
- C# 获取文件MD5校验码
using System; using System.IO; using System.Security.Cryptography; using System.Text; public class M ...
- WPF 检测输入状态
[DllImport("user32.dll")] static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); pub ...
- Hibernate unsaved-value 属性
Session的saveOrUpdate方法是由Hibernate来判断被操作对象究竟是一个持久化对象还是临时自由状态对象.这需要在对象映射文件的主键id中定义unsaved-value属性,如果不显 ...
- iOS ASIHTTPRequest用https协议加密请求
iOS 终端请求服务端数据时,为了保证数据安全,我们一般会使用https协议加密,而对于iOS的网络编程,我们一般会使用开源框架:ASIHTTPRequest,但是如果使用传统的http方式,即使忽略 ...
- 失落的C语言结构体封装艺术
Eric S. Raymond <esr@thyrsus.com> 目录 1. 谁该阅读这篇文章 2. 我为什么写这篇文章 3.对齐要求 4.填充 5.结构体对齐及填充 6.结构体重排序 ...
- cnblog可以直接黏贴qq截图,但最好不要偷懒
秋秋(qq)基本上算是ytkah本人开机后要开的软件了,平时也习惯用Ctrl+Alt+A快捷键来进行截图.很早以前ytkah一个无意间发现cnblog可以直接黏贴qq截图,当时截图后可能是忘记黏贴到其 ...
- FineUI第五天---按钮控件
按钮控件 <x:Button runat="server" ID="按下" Text="按下"></x:Button> ...
- Android第三方jar包ClassNotFind
转载请注明http://www.cnblogs.com/vanezkw/archive/2012/06/25/2561393.html 相信很多朋友在使用第三方包时都遇到过此类问题.今天就此问题进行一 ...
- 九度 OJ1008 hdu 3790
#include<stdio.h> #include<string.h> struct node { int d; int p; }g[][]; #define inf 0x3 ...
- Solr DIH导入出现 Data Config problem: 前言中不允许有内容 异常
Solr配置DIH导入时出现 “Data Config problem: 前言中不允许有内容.” 异常. <response> <lst name="responseHea ...