日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AT2675 [AGC018F] Two Trees (构造+二分图染色+并查集)

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AT2675 [AGC018F] Two Trees (构造+二分图染色+并查集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

description

戳我看題目

solution

正解說是歐拉回路,但是于私而言非常難懂,如果有興趣可以看香香mm的博客
定義一個點如果有偶數個兒子,就為奇點;如果有奇數個兒子,就為偶點
對于一個點的每個子樹自身是滿足mod2=1mod\ 2=1mod?2=1

如果是偶點,那么奇數個兒子相加mod2mod\ 2mod?2就已經滿足要求了,點權就設為000
如果是奇點,那么偶數個兒子相加取模就沒了,點權應該設為±1±1±1

單思考一個子樹的情況,算上自己,整棵樹內的奇點個數應為2k+12k+12k+1
隨便兩兩匹配后一定會孤出一個點來
這個點就通過uuu點往上跟某一個孤的祖先匹配

兩兩匹配的點對就分別取1,?11,-11,?1,二分圖染色可以搞

code

#include <cstdio> #include <vector> #include <iostream> using namespace std; #define maxn 100005 int f[maxn], c[maxn], rnk[maxn];int find( int u ) {if( u == f[u] ) return u;int fa = find( f[u] );c[u] ^= c[f[u]];return f[u] = fa; }void merge( int u, int v ) { //并查集按秩合并 int fu = find( u ), fv = find( v );if( fu == fv ) return;else if( rnk[fu] < rnk[fv] ) swap( fu, fv );else if( rnk[fu] == rnk[fv] ) rnk[fu] ++;c[fv] = c[u] ^ c[v] ^ 1;f[fv] = fu; } struct node {vector < int > G[maxn];int siz[maxn];int root;void init( int n ) {for( int i = 1, fa;i <= n;i ++ ) {scanf( "%d", &fa );if( ~ fa ) G[fa].push_back( i ), siz[fa] ++;else root = i;}}int dfs( int u ) {vector < int > num;if( ! ( siz[u] & 1 ) ) num.push_back( u );//有偶數個兒子 即奇點 for( int i = 0;i < G[u].size();i ++ )num.push_back( dfs( G[u][i] ) );for( int i = 1;i < num.size();i += 2 ) //一定是2k+1個點 兩兩匹配 孤出一個點與上面祖先匹配merge( num[i], num[i + 1] );return num[0]; }}A, B;int main() {int n;scanf( "%d", &n );A.init( n ), B.init( n );for( int i = 1;i <= n;i ++ )if( ( A.siz[i] + B.siz[i] ) & 1 ) //i點在兩棵樹上的奇偶性應一致 return ! printf( "IMPOSSIBLE\n" );printf( "POSSIBLE\n" );for( int i = 1;i <= n;i ++ ) f[i] = i;A.dfs( A.root ), B.dfs( B.root );for( int i = 1;i <= n;i ++ )if( ! ( A.siz[i] & 1 ) ) {find( i );if( c[i] ) printf( "1 " );else printf( "-1 " );}else printf( "0 " );return 0; }

總結

以上是生活随笔為你收集整理的AT2675 [AGC018F] Two Trees (构造+二分图染色+并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。