JZOJ4376 染色配對

2021-07-11 05:23:05 字數 1489 閱讀 2555

就是給一些極大團包含點的關係,使最少的極大團包含點數為奇數。

這裡題目說明每個點只與兩個極大團有被包含關係,所以我們把極大團看成點,點看成邊,則每個點連出去所有的邊(它們所對應的點)都與這個大點(所對應的極大團)有被包含關係。

於是我們搜尋每個連通塊,對於每個連通塊我們建一顆搜尋樹(如下圖,黑色邊代表搜尋樹上的邊)。

對於每乙個大點,我們把所有連出去的邊對應的未被匹配過的點的編號記錄下來,若記錄的點個數為奇數,則它與它父親連線的邊所對應的點就留給父親匹配,然後挨個輸出即可。

舉個例子:

點7連出去兩條邊編號為7、8,且都未被匹配。則(7,8)是乙個匹配。

點4連出去四條邊,未被匹配的有3、4、6(這裡假設5已被匹配),則(4,6)是乙個匹配,而多餘的3留給點4的父親點2匹配。

#include

#include

#include

#include

#define fo(i,j,k) for(int i=j;i<=k;i++)

#define fd(i,j,k) for(int i=j;i>=k;i--)

#define n 20001

#define nn 400001

#define m 200001

using

namespace

std;

int m,n;

int to[nn],next[nn],last[nn],p[nn],num=0;

int z[n];

int zc[m];

bool pp[m];

void link(int x,int y,int t)

bool bz[n];

int rt;

int find(int x)

return t;

}int g[m];

void dfs(int x,int fa)

for(int i=last[x];i;i=next[i])

if(!pp[p[i]] && p[i]!=fa) pp[p[i]]=true,g[++t]=p[i];

if(rt!=x) pp[fa]=true,g[++t]=fa;

int tt;

fo(i,1,t)

if(i%2==1) tt=g[i],pp[tt]=false;

else

}int main()

int ans=0;

fo(i,1,m)

if(!bz[i]) ans+=find(i)/2;

cout

fo(i,1,m)

if(!bz[i]) rt=i,dfs(i,0);

}

JZOJ4824 配對遊戲

流行的跳棋遊戲是在乙個有m n個方格的長方形棋盤上玩的。棋盤起初全部被動物或障礙物佔滿了。在乙個方格中,x 表示乙個障礙物,乙個 0 9 的個位數字表示乙個不同種類的動物,相同的個位數字表示相同種類的動物。一對動物只有當它們屬於同一種類時才可以被消去。消去之後,他們所佔的方格就成為空方格,直到遊戲結...

數學 JZOJ 4248 n染色

有乙個每條邊都不相等的n nn邊形,有m mm種顏色。我們要給每條邊塗上顏色使得相鄰的兩條邊都不相等,求總方案數。設f if i fi 為i ii條邊時的答案,那麼 fi mi f i 1f i m i f fi mi fi 1 代表用總的方案數減去不合法的方案數。從f i 1f fi 1 加一條邊...

jzoj4824 配對遊戲 搜尋

流行的跳棋遊戲是在乙個有m n個方格的長方形棋盤上玩的。棋盤起初全部被動物或障礙物佔滿了。在乙個方格中,x 表示乙個障礙物,乙個 0 9 的個位數字表示乙個不同種類的動物,相同的個位數字表示相同種類的動物。一對動物只有當它們屬於同一種類時才可以被消去。消去之後,他們所佔的方格就成為空方格,直到遊戲結...