lightoj 1300 边双联通分量+交叉染色求奇圈
题目链接:http://lightoj.com/volume_showproblem.php?problem=1300
边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点。这题只要求在奇圈上的点个数。容易得到,一个边双联通分量如果存在奇圈,那么整个分量上的点都属于某个奇圈。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int maxn = ;
const int maxe = ;
const int INF = 0x3f3f3f; int pre[maxn],low[maxn],dfs_clock;
bool isbridge[maxe*]; struct Edge{
int u,v;
int next;
Edge(int u=,int v=,int next=): u(u) , v(v), next(next) {}
}edges[maxe*];
int head[maxn],cnt; int color[maxn]; //用交叉染色法进行判断奇圈;
bool flag;
int n,m;
int ans,tempans; void tarjan(int u,int fa){
pre[u] = low[u] = dfs_clock++;
for(int i=head[u];i!=-;i=edges[i].next){
int v = edges[i].v;
if(!pre[v]){
tarjan(v,u);
low[u] = min(low[u],low[v]);
if(low[v] > pre[u]) { isbridge[i] = true; isbridge[i^] = true; }
}
else if(pre[v] < pre[u] && v != fa) //u->v是反向边;
low[u] = min(low[u],pre[v]);
}
} void dfs_paint(int u,int fa_c){
color[u] = fa_c;
tempans++;
for(int i=head[u];i!=-;i=edges[i].next){
if(isbridge[i]) continue; //访问到桥跳过;
int v = edges[i].v;
if(!color[v]) dfs_paint(v,-fa_c); //还没有染色;
else if(color[u] == color[v])
flag = true;
}
} void addedge(int u,int v){
edges[cnt] = Edge(u,v,head[u]);
head[u] = cnt++;
}
int main()
{
// freopen("E:\\acm\\input.txt","r",stdin);
int T;
cin>>T;
for(int t=;t<=T;t++){
cin>>n>>m;
memset(head,-,sizeof(head));
cnt = ;
for(int i=;i<=m;i++){
int a,b;
scanf("%d %d",&a,&b);
edges[cnt] = Edge(a,b,head[a]);
head[a] = cnt++;
edges[cnt] = Edge(b,a,head[b]);
head[b] = cnt++;
//addedge(a,b);
//addedge(b,a);
}
dfs_clock = ;
memset(pre,,sizeof(pre));
memset(isbridge,,sizeof(isbridge));
for(int i=;i<n;i++)
if(!pre[i]) tarjan(i,-); memset(color,,sizeof(color));
ans = ;
for(int i=;i<n;i++){
if(!color[i]){
flag = false;
tempans = ;
dfs_paint(i,); //交叉染色法
if(flag)
ans += tempans;
}
}
printf("Case %d: %d\n",t,ans);
}
}
lightoj 1300 边双联通分量+交叉染色求奇圈的更多相关文章
- 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)
layout: post title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色) author: "luowentaoaa" catalog: tru ...
- POJ 2942 Knights of the Round Table 补图+tarjan求点双联通分量+二分图染色+debug
题面还好,就不描述了 重点说题解: 由于仇恨关系不好处理,所以可以搞补图存不仇恨关系, 如果一个桌子上面的人能坐到一起,显然他们满足能构成一个环 所以跑点双联通分量 求点双联通分量我用的是向栈中pus ...
- poj 3177&&3352 求边双联通分量,先求桥,然后求分量( 临界表代码)
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h>//用容器写在3177这个题上会超内存,但 ...
- Spoj 2878 KNIGHTS - Knights of the Round Table | 双联通分量 二分图判定
题目链接 考虑建立原图的补图,即如果两个骑士不互相憎恨,就在他们之间连一条无向边. 显而易见的是,如果若干个骑士在同一个点数为奇数的环上时,他们就可以在一起开会.换句话说,如果一个骑士被一个奇环包含, ...
- 【POJ2942】Knights of the Round Table(二分图 点双联通分量)
题目链接 大意 给定\(N\)个点与\(M\)个关系,每个关系表示某两个点间没有直接的边相连,求不在所有奇环上的点的个数. (\(1\le N\le 1e3,1\le M\le 1e6\)) 思路 考 ...
- poj2942(双联通分量,交叉染色判二分图)
题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先 ...
- POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】
LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...
- 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)
[POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS Memory Limit: 65536K Total Su ...
- 『Tarjan算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
随机推荐
- SQL server 如何修改登录名和密码
No :1 启动SQL Server Management Studio,用windows登录进入: No :2 在左侧对象资源处理器中找到根节点,也就是你安装sqlserver时注册的服务器名称.然 ...
- [转]Delphi Form的释放和隐藏:free,hide,close
form.Free - 释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值. form.Hide - 隐藏Form.可以调用form.Show再一次显示. form ...
- mac 连接linux
1.ssh 通过ssh 的方式直接连接linux ssh name@ip -22 例:ssh zyc@192.168.1.100 -22 这个的前提是linux 要开启ssh 服务 先看一下linu ...
- SGU 123.The sum
#include <iostream> using namespace std; int f[50]={0,1,1}; int main(){ int n,s=0; cin>> ...
- SGU 193.Chinese Girls' Amusement
/* 实际上就是求一个k,满足k<=n/2,且gcd(n,k)=1 如果n为奇数,k为[n/2] 如果n为偶数,k=n/2-1-(n/2)%2 */ #include <iostream& ...
- 第三篇、调优之路 Apache调优
1. 简介 在第一篇中整合了apache + tomcat ,利用了apache解析静态文件为tomcat解压.但是在测试机上发现两者性能不足,不能充分利用服务器的性能,该篇中将对apache进行性 ...
- windows7 jdk 环境变量添加
JAVA_HOME D:\Java;PATH %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\l ...
- Android 视图切换库的使用 - SwitichLayout
要点: 1. SwitichLayout 原理和基本特效展示 - 设计上和基本特效 2. SwitchLayout 的用法 - SwitchLayout 的基本配置和用法 3. SwithLayout ...
- 更换Python默认软件镜像源
限于一些众所周知的原因,在我们pip安装软件的时候出现类似报错: data = self.read(amt=amt, decode_content=decode_content) File " ...
- Python学习的一些好资料
教程: 1. 廖雪峰的Python教程:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a0 ...