八省聯考2018 劈配

2022-05-07 18:42:07 字數 1228 閱讀 8926

題目這題目,乍一眼看上去像乙個dp,因為這個資料範圍一般都是dp,但是考慮到轉移有後效性,所以顯然是做不了dp的。考試的時候像著怎麼設狀態沒有後效性,失敗了,就只打了乙個70分的暴力,還掛了20分。

這題其實是個(網路流/匹配)(真心看不出,然後我寫部落格的時候旁邊yl神犇看見了,嘲諷了我一波,我是真的弱),首先我們建圖,將所有導師向匯點連一條流量為招收學員上限的邊,然後就可以開始虐題(被題虐)了,我們按次序列舉每乙個學員的志願,從原點向學員連流量為1的邊,按當前列舉到的志願由學員向導師連邊,流量為1,然後開始增廣,若失敗,則刪去這一志願連的邊,繼續列舉下一志願,若成功則這就是第一問答案,這樣的話,第\(i\)張圖就會是滿足前\(i\)個人志願的剩餘圖,這在第二問會用到,所以我們要保留下來。

然後第二問,同樣是對學員乙個乙個處理,二分他需要前進的名次,然後直接使用原來的剩餘圖進行加邊,我們可以把他前\(s_i\)的志願全部一起加上(這顯然是對的,一起做可以節省大量時間),然後開始增廣,同樣的,成功說明他可以少前進一點,失敗則需要前進更多。

#include#define il inline

using namespace std;

const int _=211;

queueq;

int s[_],n,m,fz[_][_][_],num[_][_];

struct graph

il int bfs()}}

return f;

}il int dfs(int u,int ma)

for(int i=a[u];i;i=nex[i])}}

return 0;

}il int dinic()

return f;

}}g[_];

il int check(int p,int i)

}return g[201].dinic();

}int main()

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

for(int j=1;j<=m;++j)

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

scanf("%d",&s[i]);

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

if(g[i].dinic())

if(j==m)}}

puts("");

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

printf("%d ",l);

}puts("");

}}

八省聯考2018 劈配

題解 這題思路就是暴力。主要在於分析複雜度?dinic跑二分圖 msqrt n 這題好像用不到。首先這是個匹配問題顯然需要利用網路流 考慮第一問 每一次我們就暴力按照志願順序加入邊 直到二分圖匹配數 1 這個複雜度是 nm nm 的 因為一次只增廣一條邊所以每次是nm的,不過這個很明顯是跑不滿而且差...

八省聯考2018 劈配

一年一度的綜藝節目 中國新 又開始了。zayid 從小就夢想成為一名程式設計師,他覺得這是乙個展示自己的舞台,於是他毫不猶豫地報名了。輕車熟路的zayid 順利地通過了海選,接下來的環節是導師盲選,這一階段的規則是這樣的 總共n 名參賽選手 編號從1 至n 每人寫出乙份 並介紹自己的夢想。接著 由所...

八省聯考2018 劈配(最大流)

從源到每乙個人連一條容量為 1 的邊。從每乙個導師到匯連一條容量為導師戰隊人數的邊。第一問我們依次列舉每乙個學員,然後再依次與第 1 至 m 志願的老師連邊,如果與第 i 志願的導師連邊跑最大流使得最大流改變,說明找到了乙個導師與自己對應。自己的最小的能實現的志願就是 i 如果找不到志願i的導師要把...