hdu5354 Bipartite Graph
来源:互联网 发布:美国读博士条件知乎 编辑:程序博客网 时间:2024/06/06 00:35
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5354
题意:求删去每个点后图是否存在奇环(n,m<=1e5)
分析:看上去无从下手,这题的思路还是比较神奇。
首先判断图是否存在奇环,可以采用dfs(染色判定)或者并查集的方法,对于这道题来说,染色每次都要遍历全图,复杂度显然吃不消,我们考虑并查集。
并查集判断图是否存在奇环,核心在于每个节点要维护他到当前并查集根的距离的奇偶性,由于本题需要回溯(并查集需要复原),因此不使用路径压缩写起来会方便些。每次回溯的时候,只需要提前记录当前合并了哪些节点,把产生的影响倒着复原即可。
对于本题来说,由于要求删去每个点之后图是否存在奇环,其实删去a之后的图和删去b之后的图有很多条边都不受影响。这告诉我们可以分治。
#include<bits/stdc++.h>using namespace std;typedef pair<int,int>pi;const int Maxn=100020;int rep[Maxn];int n,m;vector<pi>ee[Maxn<<2];int f[Maxn],sz[Maxn],val[Maxn];bool in(int a,int L,int R){ return a>=L&&a<=R;}void process(int l,int r,int x,vector<pi>&tp);pi find(int x){ int ret=x; int w=0; for(;f[ret]!=ret;ret=f[ret])w^=val[ret]; w^=val[ret]; return pi(ret,w);}void solve(int l,int r,int x){ if(l==r){rep[l]=1;return;} int mid=(l+r)>>1; ee[x<<1].clear();ee[x<<1|1].clear(); vector<pi>tp[2]; for(int i=0;i<ee[x].size();i++) { int a=ee[x][i].first,b=ee[x][i].second; if(in(a,l,mid)||in(b,l,mid))ee[x<<1].push_back(ee[x][i]); else tp[0].push_back(ee[x][i]); if(in(a,mid+1,r)||in(b,mid+1,r))ee[x<<1|1].push_back(ee[x][i]); else tp[1].push_back(ee[x][i]); } process(l,mid,x<<1,tp[0]); process(mid+1,r,x<<1|1,tp[1]); }void process(int l,int r,int x,vector<pi>&tp){ vector<pi>res; bool flag=0; for(int i=0;i<tp.size();i++) { int u=tp[i].first,v=tp[i].second; pi fu=find(u),fv=find(v); if(fu.first==fv.first) { if(!(fu.second^fv.second)) { flag=1; break; } } else { int t1=sz[fu.first]>sz[fv.first]?fu.first:fv.first; int t2=fu.first+fv.first-t1; int t3=fu.second^fv.second; f[t2]=t1; sz[t1]+=sz[t2]; res.push_back(pi(t2,t3)); val[t2]^=t3; } } if(flag) { for(int i=l;i<=r;i++)rep[i]=0; } else solve(l,r,x); for(int i=res.size()-1;i>=0;i--) { int u=res[i].first; sz[f[u]]-=sz[u]; val[u]^=res[i].second; f[u]=u; }}int main(){ int _;scanf("%d",&_); while(_--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)f[i]=i,sz[i]=1,val[i]=1; ee[1].clear(); for(int i=0;i<m;i++) { int u,v;scanf("%d%d",&u,&v); if(u>v)swap(u,v); ee[1].push_back(pi(u,v)); } solve(1,n,1); for(int i=1;i<=n;i++)putchar(rep[i]+'0');puts(""); }}
0 0
- hdu5354 Bipartite Graph
- Bipartite Graph
- Bipartite graph/network学习
- HDU5313.Bipartite Graph
- hdu5313--Bipartite Graph
- hdu 5313 Bipartite Graph
- hdu-5313 Bipartite Graph
- hdu 5313 Bipartite Graph
- HDU 5313 Bipartite Graph
- [HDU 5354] Bipartite Graph
- FZU2141 Sub-Bipartite Graph 贪心
- 【染色】 HDU 5313 Bipartite Graph
- FZU 2141Sub-Bipartite Graph
- FZU 2141 Sub-Bipartite Graph
- fzu 2141 Sub-Bipartite Graph (贪心)
- 【随机】 FZU 2141 Sub-Bipartite Graph
- 【贪心】 FOJ 2141 Sub-Bipartite Graph
- hdu 5313 Bipartite Graph 贪心+bfs染色
- 【DP】poj2486
- HttpUrlConnection网络连接
- 线程与进程的区别
- ios中的UIAutomation脚本的录制
- Java ImageIcon 不能显示问题
- hdu5354 Bipartite Graph
- Java从键盘输入值
- Android之——JNI与C语言常见术语
- 并发与并行以及抽象的重要性
- pojThe xor-longest Path(trie树)
- _OBJECT_TYPE_INITIALIZER 结构
- git tag 操作
- 第十章 多处理器和实时调度
- 【leetcode】Power of Two【java】