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

思路:首先反向建立补图,然后问题转换成在图中找奇圈,圈肯定出现在双联通分量中,则求出图的双联通分量,又通过特性知道,一个双联通分量有奇圈则其中的点都可以出现在一个奇圈中。而对于奇圈的判定可以用交叉染色判断是非为二分图,二分图中肯定无奇圈,这里用tarjan算法得出割边(先将点入队),确定双联通分量的根节点,(对于队列中的点)然后进行染色判定,最后标记odd[]代表需要删除的点。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAXN 1004
#define MAXM 1001000int n,m,tot,count,top;
int first[MAXN],DFN[MAXN],Low[MAXN],vis[MAXN],col[MAXN],mark[MAXN],stack[MAXM],odd[MAXN];
int G[MAXN][MAXN];
struct Edge
{int st,to,next,vis;
}edge[2*MAXM];
void addedge(int a,int b)
{edge[tot].to=b;edge[tot].st=a;edge[tot].next=first[a];edge[tot].vis=0;first[a]=tot++;
}
int find(int s)
{for(int i=first[s];i!=-1;i=edge[i].next){int t=edge[i].to;if(mark[t]){if(col[t]==-1){col[t]=!col[s];return find(t);}else if(col[t]==col[s]) return 1;}}return 0;
}
void color(int s)
{int i;memset(mark,0,sizeof(mark));do{i=stack[top--];mark[edge[i].st]=1;mark[edge[i].to]=1;}while(edge[i].st!=s);memset(col,-1,sizeof(col));col[s]=0;if(find(s)){for(int i=1;i<=n;i++){if(mark[i])odd[i]=1;}}
}
void dfs(int s)
{DFN[s]=Low[s]=++count;for(int i=first[s];i!=-1;i=edge[i].next){int v=edge[i].to;if(edge[i].vis)continue;edge[i].vis=edge[i^1].vis=1;stack[++top]=i;if(!DFN[v]){dfs(v);Low[s]=min(Low[s],Low[v]);if(Low[v]>=DFN[s])color(s);}else{Low[s]=min(Low[s],DFN[v]);}}
}
int main()
{while(scanf("%d%d",&n,&m),n||m){memset(G,0,sizeof(G));for(int i=1;i<=m;i++){int a,b;scanf("%d%d",&a,&b);G[a][b]=1;G[b][a]=1;}tot=0;memset(first,-1,sizeof(first));for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(G[i][j]==0){addedge(i,j);addedge(j,i);}}}memset(DFN,0,sizeof(DFN));memset(odd,0,sizeof(odd));count=0;top=0;for(int i=1;i<=n;i++){if(!DFN[i])dfs(i);}int ans=0;for(int i=1;i<=n;i++){if(!odd[i])ans++;}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/amourjun/p/5134123.html

poj2942(双联通分量,交叉染色判二分图)相关推荐

  1. lightoj 1300 边双联通分量+交叉染色求奇圈

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...

  2. 圆桌骑士(点双联通分量+二分图判定)

    [问题描述]   有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少有3个骑士参加,且相互憎恨的骑士不能坐在圆桌的相邻位置.如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是大于1的奇 ...

  3. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  4. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...

    1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...

  5. POJ-3352-RoadConstruction(边双联通分量,缩点)

    链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...

  6. 10.31T2 点双联通分量+预处理前缀+二分答案

    2.逛公园I  (parka) [问题描述] 琥珀色黄昏像糖在很美的远方,思念跟影子在傍晚一起被拉长--       小 B 带着 GF 去逛公园,公园一共有 n 个景点,标号为 1 . . . n. ...

  7. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...

  8. 【BZOJ2959】【codevs2002】长跑,维护双联通分量

    传送门1 传送门2 思路: 思路巧妙的一道数据结构 题意就是让你维护双联通分量 我一开始的想法是写两个并查集来分别维护连通性和双联通分量里的点,然后通过LCT来维护权值和,但我发现缩点时不是很好搞,而 ...

  9. 【BZOJ2730】【codevs1996】矿场建设,点双联通分量

    传送门1 传送门2 思路: 前段时间学习的tarjan求双联通分量 练习的时候碰到了这样一道蛋疼的题 基本思路还是显而易见的,考虑分割联通快及计算大小来求出答案 由于之前写的都是边双联通分量,可以把无 ...

最新文章

  1. Android APP破解利器Frida之反调试对抗
  2. python下保持mysql连接,避免“MySQL server has gone away“方法
  3. shiro将session认证改成token认证_初步学习Shiro框架 第一集
  4. windows计划任务+批处理文件实现oracle数据库的定时备份与恢复
  5. 简单的Java服务器和客户端的通信
  6. VS下Qt4.8.4安装
  7. Windows系统IP地址自动切换
  8. LFM信号脉冲压缩原理和仿真
  9. 古代常见文学常识汇总
  10. android手机获取qq闪照的方法,QQ闪照怎么保存 闪照保存到手机的方法教程
  11. 著名npm包被毁,GitHub强烈谴责!开源作者因反俄给代码投毒遭猛烈抨击
  12. 对圆柱面的曲面积分_积分曲面为圆柱面的曲面积分的计算
  13. 规则引擎 Drools
  14. 【计算机网络13】网络安全
  15. Linux下如何设置程序的开机自启动功能
  16. Java - char型变量中能不能存贮一个中文汉字,为什么?
  17. 基于Stm32f407 的贪吃蛇小游戏【正点原子-探索者开发板】
  18. Centos7x破解密码
  19. HTTP-web-Internet
  20. nodeJs npm和 homebrew https://www.jianshu.com/p/131dda5e51fe

热门文章

  1. Bash(Shell)基础知识
  2. 网络诈骗是大数据的“原罪”吗
  3. Flex布局新旧混合写法详解
  4. 带命名空间的XML的dom4j应用转
  5. 外网DNS系统外网访问及邮件系统外网域名访问问题
  6. A3D8的水–WaterMaterial for Alternativa3D 8
  7. 利用Kubernetes名称空间来管理内存和CPU资源(一)
  8. Java获取请求客户端的真实IP地址
  9. Qt中的QString和QByteArray之间转换
  10. 华为宣布:免费培养K8s和微服务开发者