題目這題目,乍一眼看上去像乙個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的導師要把...