題目描述
有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 ...