连通类经典题

题意及分析参考:

1.建反向图 2.tarjan 算法求割点3.二部图与奇圈 4.交叉染色

http://blog.csdn.net/lyy289065406/article/details/6756821

算法:

无向图寻找割点的 tarjan 算法,叉分染色。

目标:

找出图中所有的奇圈(点数大于 3),并标记在圈上的点,最后计算出未被标记的点数。

PS:

记得找到奇圈才是关键: low[v] >= dfn[u] ( tarjan 算法 )

做完这道题,很累,真的自己想不出来,后来发现,自己把 tarjan 算法的几个关键都托付给模板了。。。(有向图、无向图的割点、桥)

// zstu_wangrui  2942    Accepted    4236K   1094MS  C++   2397B   2013-08-02 19:02:41
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1010;
int min( int a, int b ){ return a < b ? a : b; }
int max( int a, int b ){ return a > b ? a : b; }
struct Edge{int v, sign, next;
}edge[maxn*maxn];
int tot, head[maxn];
struct EE{int u, v;EE(){}EE( int a, int b ) : u(a), v(b){}
}st[maxn];
int top;
int n, r, E[maxn][maxn];
void init()
{memset(E, -1, sizeof(E));tot = 0;memset(head, -1, sizeof(head));
}
void add_edge( int u, int v )
{   edge[tot].v = v;edge[tot].sign = 0;edge[tot].next = head[u];head[u] = tot++;edge[tot].v = u;edge[tot].sign = 0;edge[tot].next = head[v];head[v] = tot++;
}
int color[maxn], ans, flag, In[maxn], vis[maxn];
void dfs( int u, int p, int col )
{color[u] = col;int i, v;for(i = head[u]; i != -1; i = edge[i].next){   v = edge[i].v;if(vis[v]){if(color[v] == -1)dfs( v, u, !col );else if(color[v] == color[u])flag = 1;if(flag)return ;}}
}
int tmpdfn, dfn[maxn], low[maxn];
void tarjan( int u )
{   low[u] = dfn[u] = tmpdfn++;int i, v, j;EE t;for(i = head[u]; i != -1; i = edge[i].next)if(!edge[i].sign){    v = edge[i].v;edge[i].sign = edge[i^1].sign = 1;if(dfn[v] == -1){EE temp( u, v );st[top++] = temp;tarjan( v );low[u] = min( low[u], low[v] );if(low[v] >= dfn[u])    //割点{memset(vis, 0, sizeof(vis));do{ t = st[--top];vis[t.u] = vis[t.v] = 1;}while( top >= 0 && !(t.u == temp.u && t.v == temp.v) );flag = 0;memset(color, -1, sizeof(color));dfs( u, u, 1 );if(flag)for(j = 1; j <= n; j++)if(vis[j])In[j] = 1;}if( low[v] > dfn[u] );//桥}else low[u] = min( low[u], dfn[v] );}if( low[u] == dfn[u] );//缩点时刻 }
void SCC()
{int i;top = 0;tmpdfn = 1;memset(dfn, -1, sizeof(dfn));for(i = 1; i <= n; i++)if(dfn[i] == -1)tarjan( i );
}int main()
{int u, v, i, j;while( ~scanf( "%d%d", &n, &r ), n + r ){init();while( r-- ){scanf( "%d%d", &u, &v );E[u][v] = E[v][u] = 0;}for(u = 1; u <= n; u++)for(v = u + 1; v <= n; v++)if(E[u][v])add_edge( u, v );    memset(In, 0, sizeof(In));SCC();ans = 0;for(i = 1; i <= n; i++)if(In[i])ans++;printf( "%d\n", n - ans );}return 0;
}

poj 2942 圆桌骑士 无向图割点 奇圈 交叉染色相关推荐

  1. POJ 2942 圆桌骑士 (点双学习笔记)

    割点 在无向连通图G上进行如下定义: • 割点:若删掉某点P后,G分裂为两个或两个以上的子图,则称P为G的割点. • 割点集合:在无向连通图G中,如果有一个顶点集合,删除这个顶点集合以及与该点集中 的 ...

  2. POJ 2942 圆桌骑士

    之前做过这个题目,现在回想起来,又有新的柑橘. 求必须出去的骑士人数. 每一个双连通分量,如果是一个奇圈,那么一定是二分图染色失败. 依次遍历每个双连通分量,但是,对于邻接表中,有一些点不是双连通分量 ...

  3. poj2942 圆桌骑士(点双连通分量+二分图染色法判奇环)

    题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 分析:图论 ...

  4. poj2942 圆桌骑士

    题目大意:给定n个骑士以及m个讨厌关系,让你找到满足以下关系的需要减去骑士的最少数: 1.每个骑士的两边必须是自己的朋友! 2.每个桌子上必须坐奇数个人,这就意味着必须转化为一个奇圈,如果一个骑士不能 ...

  5. POJ 2942 Knights of the Round Table (奇圈+点双联通)

    题意:在亚瑟王的圆桌骑士团中,某些骑士两两之间相互憎恨,这样一来他们开会的时候边不能相邻的坐着.即肯定存在某些人不能参加会议.假如一个骑士所有的会议都不能出席,那么他就会被驱逐.现在已知那些骑士之间相 ...

  6. LA 3523 圆桌骑士

    题目链接:http://vjudge.net/contest/141787#problem/A http://poj.org/problem?id=2942 此题很经典 知识点:DFS染色,点-双连通 ...

  7. poj 2942 Knights of the Round Table(双连通分量+tarjan+二分图判定)

    http://poj.org/problem?id=2942 题意: 有N个骑士,给出某些骑士之间的仇恨关系,骑士们开会时会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件: 1:任意相互憎恨的 ...

  8. POJ2942 UVA1364 Knights of the Round Table 圆桌骑士

    POJ2942 洛谷UVA1364(博主没有翻墙uva实在是太慢了) 以骑士为结点建立无向图,两个骑士间存在边表示两个骑士可以相邻(用邻接矩阵存图,初始化全为1,读入一对憎恨关系就删去一条边即可),则 ...

  9. poj 2942 点双连通分量

    1 /* 2 题意:有n个骑士,某些其实之间hate each other,互相hate的其实不能相邻而坐,然后会开多次圆桌会议, 3 每次从n个骑士中抽出3个或以上的奇数个骑士参加会议并且围着圆桌而 ...

最新文章

  1. python jit_Pyston是一个基于JIT的Python开源实现
  2. 144. Binary Tree Preorder Traversal 二叉树的前序遍历
  3. SpringBoot整合RabbitMQ测试
  4. Omap3530 的GPIO中断设置
  5. python语言中包含的标准数据类型_Python对象——标准类型的分类
  6. ExtAspNet公司项目截图
  7. 绘制隐藏层的激活值的分布[直方图]
  8. python计算机代码_python告白代码,只属于程序员的浪漫
  9. HttpServletResponse response详解
  10. centos u盘安装_利用Win32 Disk Imager 实现U盘刻录ISO
  11. 关关采集器如何配置代理ip【图文教程】
  12. android抓取微信朋友圈,一种快速提取Android微信朋友圈数据的方法
  13. 传真服务器维护,DreamFax传真服务器
  14. 怎样使用Fiddler工具进行APP抓包
  15. 计算机排版原理,课外计算机排版原理(高级版) 7.ppt
  16. C#更新word目录
  17. 现实版的“疑犯追踪”是如何开展的?
  18. 虚拟机 host-only网络配置
  19. EOS区块链PHP开发包
  20. 基于python实现的双月模型

热门文章

  1. 马云鹤:人间四月,芳菲深处是流年
  2. 浙江大学计算机学院2021推免名单,2020年新增预推免/推免招生信息33所+名单10所(9月25日)...
  3. JavaScript高级程序设计学习笔记----初识JavaScript
  4. 点云数据常用处理:C++实现
  5. maven依赖找不到问题
  6. 动态规划子序列系列力扣题目
  7. SAP BASIS ADM100 中文版 Unit 1(1)
  8. nRF52832 — DFU升级
  9. carla学习笔记2 传感器和数据
  10. ElasticSearch入门-搜索(java api)