題解 P1682 過家家

2022-05-05 20:12:09 字數 2286 閱讀 5111

題目描述

有2n個小學生來玩過家家遊戲,其中有n個男生,編號為1到n,另外n個女生,編號也是1到n.每乙個女生可以先選擇乙個和她不吵嘴的男生來玩,除此之外,如果編號為x的女生的朋友(也是女生,且編號為y)不和編號為z的男生吵嘴,那麼x也可以選擇z.此外,朋友關係是可以傳遞的,比如a和b是朋友,b和c是朋友,那麼我們可以認為a和c也是朋友.

當每一位女生都選擇了玩伴,那麼他們會開始新一輪遊戲.在每一輪後,每個女生都會開始去找乙個新的男生做玩伴(以前沒選過).而且每乙個女生最多能強制k個男生接受,無論他們以前是否吵嘴.

現在你的任務就是確定這2n個小學生最多能玩幾輪遊戲.

輸入輸出格式

輸入格式:

第一行有4個整數n,m,k,f(3<=n<=250,0n表示有2n個小學生,其中n個男生n個女生.

接下來m行,每行包含2個數字a,b表示編號為a的女生和編號為b的男生從沒吵嘴過.

再接下來f行,每行包含2個數字c,d表示編號為c的女生和編號為d的女生是朋友.

輸出格式:

對於每組資料,輸出乙個整數,表示2n個小學生最多能玩幾輪.

這一題和p3153 [cqoi2009]跳舞 幾乎是一模一樣,那篇題解可以看這裡,建圖 + 最大流 + 二分即可得到答案,這裡不在贅述,寫這篇題解是要解決題目中連通性的問題

題目中有提到過,朋友關係是可以傳遞的,比如a和b是朋友,b和c是朋友,那麼我們可以認為a和c也是朋友,據此我們有兩個思路:

1.並查集

2.floyd

雖然我很擅長並查集,但是很可惜,並查集的做法在這題並不是特別適用:理由如下:

並查集的最大用處是,利用父親這一概念很方便的判斷兩元素是否處於同一集合,但通過某一節點,我們不能很快確定其他節點是否與他在一集合內,唯一想到的方法是遍歷所有節點,一一判斷是否屬於同一集合,比較麻煩,故不適用並查集。

floyd演算法可以判斷圖的聯通性,偽**大概如下:

for(所有節點(作為中間點))

}}

這就是傳遞閉包,能適用與這題,理由如下:

利用傳遞閉包,我們在處理完關係之後可以得到乙個二維陣列,可以很容易的判斷兩點是否聯通

所以我們使用floyd傳遞閉包,解決關係問題,不過要對上述偽**做適當修改:(男孩b和女孩a玩 && 女孩a和女孩c是朋友)---> 男孩和女孩c玩

所以我們得到**:

void floyd()}}

}//主函式部分

for(int i = 1;i <= nr;i++)

for(int i = 1;i <= nf;i++)

floyd();

最後二分多次建圖跑最大流驗證答案即可

#include#include#include#include#include#define ll long long

using namespace std;

int rd()

while(c >= '0' && c <= '9')

return flag * out;

}const int maxn = 100019,inf = 1e9;

int num,k,nr,nf,nume = 1;

int dance[190][190];

int frind[190][190];

int s,t,maxflow;

int head[maxn << 2];

struct nodee[maxn << 3];

void add(int u,int v,int dis)

int d[maxn];

bool bfs()}}

return 0;

}int dinic(int u,int flow)

}return flow - rest;

}void build(int a)

for(int i = 1;i <= num;i++)

else}}

}bool check(int mid)

int search(int l,int r)

return ans;

}void floyd()}}

}int main()

for(int i = 1;i <= nf;i++)

floyd();

printf("%d\n",search(0,num + k));

return 0;

}

題解 P2058 海港

我們注意到資料範圍,發現二維陣列並不可取,但是我們又注意到 k i 3 105 ki 3 10 5,所以採取一種新的思想 將所有人都讀在乙個一維陣列裡面 使用乙個佇列 q q 來儲存第 i role presentation i i艘船上人數的範圍,即 q q 儲存的是兩個數 l r role pr...

題解 P4995 跳跳!

說實話這個題我一開始想了好久dfs超時得了30可能因為我太弱了 吃得苦中苦方為人上人現在終於a了當然體會更多 1 首先 這是個真的真的貪心題 貪心思路就是每次都從未跳過得最高的 或最低的 跳到最低處 最高處 這樣差值才最大 2 知道貪心思路了就要寫好 qaq 寫法有很多種,像我這種蒟蒻就只會寫這一種...

題解 P1434 滑雪

題目鏈結 此題運用功能強大的 暴力搜尋 記憶化搜尋才是重點!然而,這是一道經典的dp問題 如果我們用 dis i j 來表示座標為 i,j 時的高度 cnt i j 是我們的記憶化陣列 在合法的前提下,就有狀態轉移方程 dis i j max dis i 1 j dis i j 1 dis i 1 ...