POJ 2942 点双联通+二分图染色
来源:互联网 发布:如何正确下载软件 编辑:程序博客网 时间:2024/04/20 11:13
点击打开链接
题意:给n个骑士和m对关系,关系是互相仇恨,现在召开一个圆桌会议,要求相邻的两个人不能有仇恨关系,问有多少骑士不管怎么分配都不能参加会议
思路:白书上的经典例题
#include <stack>#include <vector>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const ll INF=0x3f3f3f3f3f3f3f3fll;const int maxn=1010;//注意点的编号从0开始的struct edge{ int u,v; edge(int a,int b){u=a;v=b;}};int pre[maxn],iscut[maxn],bccno[maxn],dfs_clock,bcc_cnt,n,m;vector<int>G[maxn],bcc[maxn];stack<edge>S;int dfs(int u,int fa){ int lowu=pre[u]=++dfs_clock; int child=0; for(unsigned int i=0;i<G[u].size();i++){ int v=G[u][i]; edge e=edge(u,v); if(!pre[v]){ S.push(e);child++; int lowv=dfs(v,u); lowu=min(lowv,lowu); if(lowv>=pre[u]){ iscut[u]=1;bcc_cnt++;bcc[bcc_cnt].clear(); while(1){ 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<0&&child==1) iscut[u]=0; return lowu;}void find_bcc(){ memset(pre,0,sizeof(pre)); memset(iscut,0,sizeof(iscut)); memset(bccno,0,sizeof(bccno)); dfs_clock=0;bcc_cnt=0; for(int i=0;i<n;i++) if(!pre[i]) dfs(i,-1);}bool vis[maxn][maxn];int odd[maxn],color[maxn];bool bipartite(int u,int b){ for(unsigned int i=0;i<G[u].size();i++){ int v=G[u][i]; if(bccno[v]!=b) continue; if(color[v]==color[u]) return 0; if(!color[v]){ color[v]=3-color[u]; if(!bipartite(v,b)) return 0; } } return 1;}int main(){ int u,v; while(scanf("%d%d",&n,&m)!=-1){ if(n==0&&m==0) break; for(int i=0;i<maxn;i++) G[i].clear(); memset(vis,0,sizeof(vis)); memset(odd,0,sizeof(odd)); while(m--){ scanf("%d%d",&u,&v);u--;v--; vis[u][v]=1;vis[v][u]=1; } for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) if(!vis[i][j]) G[i].push_back(j),G[j].push_back(i); find_bcc(); for(int i=1;i<=bcc_cnt;i++){ memset(color,0,sizeof(color)); for(unsigned int j=0;j<bcc[i].size();j++) bccno[bcc[i][j]]=i; int u=bcc[i][0];color[u]=1; if(!bipartite(u,i)) for(int j=0;j<bcc[i].size();j++) odd[bcc[i][j]]=1; } int sum=0; for(int i=0;i<n;i++) if(odd[i]) sum++; printf("%d\n",n-sum); } return 0;}
0 0
- POJ 2942 点双联通+二分图染色
- POJ 2942 Knights of the Round Table(点双联通+二分图+染色)
- POJ 2942:Knights of the Round Table tarjan点双联通分量 二分图染色找奇环
- poj 2942 (点双联通+判断二分图)
- poj 2942 (点双联通+判断二分图)
- poj 2942 求点双联通+二分图判断奇偶环+交叉染色法判断二分图
- poj 2942 点双连通分量+二分图染色
- POJ 2942 - Knights of the Round Table(点双联通+二分图)
- poj2942(双联通分量,交叉染色判二分图)
- poj-2942-点双联通
- poj 2942 双连通+tarjan+割点+奇环判断+二分图染色
- POJ 2942 Knights of the Round Table [二分图染色][点双连通分量]
- [POJ]2942 圆桌骑士 点双连通分量 + 二分图染色
- POJ 2942 Tarjan双联通分量+二分图 解题报告
- 二分图+染色 poj 2492
- POJ 2942 Knights of the Round Table (点-双连通分量 + 交叉法染色判二分图)
- poj 2942 双连通分量+二分图的染色判断
- 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)
- 身份证 验证
- 禁用sublime自动更新提示
- Httpurlconnection多文件上传问题。
- Hbase启动从节点报错:FATAL org.apache.hadoop.hbase.regionserver.HRegionServer:...ClockOutOfSyncException
- 3Sum Smaller
- POJ 2942 点双联通+二分图染色
- 蓝鸥Unity开发基础—— 二维数组学习笔记
- makefile从shell中获取要跑的testcase
- 字符串前缀:字典树(Trie)的应用
- Regularized least-squares classification(RLSC)
- [leetcode] 78. Subsets
- java.util.TreeMap
- c/c++中整型数据的数据范围
- 腾讯云数据库CDB介绍及数据库与应用数据库分析