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算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
随机推荐
- ViewPager + Fragment 实现类微信界面
在如今的互联网时代,微信已是一个超级App.这篇通过ViewPager + Fragment实现一个类似于微信的界面,之前有用FragmentTabHost实现过类似界面,ViewPager的实现方式 ...
- Win10获取管理员/administrator权限的方法
与Win7不同,Win10右键文件夹菜单,是没有“获取管理员权限”这个功能的,但是有时候我们偏偏需要用到这个功能,怎么办呢,可以按照这个办法实现:把下面的这一段代码复制下来放在文本文档中,然后另存为. ...
- linux常用命令之ln
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...
- [转]Delphi Form的释放和隐藏:free,hide,close
form.Free - 释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值. form.Hide - 隐藏Form.可以调用form.Show再一次显示. form ...
- servlet的doPost 和doGet和web文件结构
doPost和doGet分别由 tomcat自己来决定调用post 还是get 方式查询 get:url有少量的参数信息,一般用到查询那里 (像百度.. post一般用来提交大文件数据(二进制数据 d ...
- CSS3 :nth-child() 选择器
CSS3 :nth-child() 选择器 代码: <!DOCTYPE html> <html> <head> <style> p:nth-child( ...
- iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)
iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) 1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加 ...
- 优秀开源项目的svn地址
很多优秀的开源项目已经提供SVN源码签出了,无论是解疑还是学习,都是一大幸福之事啊! Apache的SVN库,强烈推荐! http://svn.apache.org/repos/asf/ 里面不但有S ...
- Java 内部类种类及使用解析
package com.learnjava.innerclass; class MemberInner { private int d = 1; private int a = 2; // 定义一个成 ...
- 修改weblogic jvm启动参数
进入: D:\Oracle\Middleware\user_projects\domains\base_domain\startWebLogic.cmd 在call 上一行增加: set USER_M ...