【AGC018F】Two Trees 构造 黑白染色
来源:互联网 发布:淘宝买多少单有一颗心 编辑:程序博客网 时间:2024/05/16 11:32
题目描述
有两棵有根树,顶点的编号都是
你要给每个点一个权值
题解
我们很容易得到只考虑一棵树时每个点的权值的奇偶性。如果只考虑
现在我们构造一个
如果一个点的儿子个数是奇数,那么
现在只考虑一棵子树。
对于每一棵子树,一定有
证明:因为整棵子树的权值和是奇数,所以有奇数个权值是奇数的点。
那么可以匹配出
这样得到的图每个点的度数
然后把两棵树得到的边合在一起,得到的图就是一个二分图。
为什么?因为如果有奇环就一定会有相邻两条边来自同一棵树,但这是不可能的。所以就没有奇环。
对于这个图黑白染色,黑色的点选
时间复杂度:
代码
#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<ctime>#include<utility>#include<cmath>#include<functional>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> pii;typedef pair<ll,ll> pll;void sort(int &a,int &b){ if(a>b) swap(a,b);}void open(const char *s){#ifndef ONLINE_JUDGE char str[100]; sprintf(str,"%s.in",s); freopen(str,"r",stdin); sprintf(str,"%s.out",s); freopen(str,"w",stdout);#endif}int rd(){ int s=0,c; while((c=getchar())<'0'||c>'9'); do { s=s*10+c-'0'; } while((c=getchar())>='0'&&c<='9'); return s;}int upmin(int &a,int b){ if(b<a) { a=b; return 1; } return 0;}int upmax(int &a,int b){ if(b>a) { a=b; return 1; } return 0;}struct graph{ int v[200010]; int t[200010]; int h[100010]; int n; graph() { n=0; } void add(int x,int y) { v[++n]=y; t[n]=h[x]; h[x]=n; }};graph g1,g2,g;int fa[100010];int fb[100010];int a1[100010];int a2[100010];int st[100010];int top;int b[100010];int c[100010];void dfs1(int x){ int i; for(i=g1.h[x];i;i=g1.t[i]) dfs1(g1.v[i]); if(a1[x]) st[++top]=x; while(top>=2) { g.add(st[top],st[top-1]); g.add(st[top-1],st[top]); top-=2; }}void dfs2(int x){ int i; for(i=g2.h[x];i;i=g2.t[i]) dfs2(g2.v[i]); if(a2[x]) st[++top]=x; while(top>=2) { g.add(st[top],st[top-1]); g.add(st[top-1],st[top]); top-=2; }}void dfs(int x,int v){ c[x]=v; b[x]=1; int i; for(i=g.h[x];i;i=g.t[i]) if(!b[g.v[i]]) dfs(g.v[i],-v);}int main(){// open("agc018f"); int n; scanf("%d",&n); int i; int rt1,rt2; for(i=1;i<=n;i++) a1[i]=a2[i]=1; for(i=1;i<=n;i++) { scanf("%d",&fa[i]); if(fa[i]==-1) rt1=i; else { g1.add(fa[i],i); a1[fa[i]]^=1; } } for(i=1;i<=n;i++) { scanf("%d",&fb[i]); if(fb[i]==-1) rt2=i; else { g2.add(fb[i],i); a2[fb[i]]^=1; } } for(i=1;i<=n;i++) if(a1[i]!=a2[i]) { printf("IMPOSSIBLE\n"); return 0; } printf("POSSIBLE\n"); top=0; dfs1(rt1); top=0; dfs2(rt2); for(i=1;i<=n;i++) if(!b[i]) dfs(i,1); for(i=1;i<=n;i++) if(!a1[i]) printf("0 "); else printf("%d ",c[i]); return 0;}
阅读全文
0 0
- 【AGC018F】Two Trees 构造 黑白染色
- [agc018f]Two Trees
- hdu 5402 Travelling Salesman Problem(构造+棋盘黑白染色)
- 黑白染色(钟沛林)
- 【TsinsenA1309】黑白染色题解
- 黑白染色棋子
- DFS黑白染色
- BFS黑白染色
- 2638: 黑白染色
- HDOJ 4751 黑白染色问题
- acdream 1056 (黑白染色)
- uva10004 Bicoloring 黑白染色问题,DFS
- HDU 1569 黑白染色+最小割
- 【HDU】4859 海岸线 黑白染色+最小割
- hdu5285黑白染色二分最大匹配
- uva 10237 Bishops 黑白染色处理
- luoguP1330 封锁阳光大学 黑白染色
- uva-two trees
- (3)树莓派3b命令行版网易云音乐
- Git远程操作详解
- 常见的排序算法总结
- 数据结构-快速排序的三种实现方式及其优化
- 高级语言多态对比
- 【AGC018F】Two Trees 构造 黑白染色
- spring-mvc-mybatis web子目录xml文件
- linux安装SSH+允许root用户远程登录
- Tensorflow爬过的坑
- 通俗易懂的_A*
- 编写优质嵌入式C程序(转)
- XML约束
- Angular4_checkbox双向绑定
- 协同过滤推荐算法总结(转载)