八省聯考2018 劈配 網路流 二分

2022-03-25 20:56:27 字數 1889 閱讀 2721

題目大意:略

先考慮第一問

直接跑最大流肯定是不好使的

考慮動態地進行這個過程

列舉每個選手,列舉每一等級的志願

把選手向當前志願內的每個導師都連流量為1的邊,然後找增廣路

如果找不到增廣路,說明在當前等級志願內並不能找到合法導師,刪掉當前狀態下選手和導師的所有邊,繼續列舉下一等級志願

如果找到了增廣路,說明存在合法導師,跳出。並繼續列舉下乙個選手

寫個偽**:

for 選手1~n

for 志願等級1~m

1.把選手向當前等級志願內的所有導師連流量為1的邊

2.找不到增廣路:刪掉所有和導師間的連邊

找到了增廣路:跳出

正確性似乎顯然啊

第二個問怎麼搞?

發現這個問題具有單調性,考慮二分

驗證需要還原加入前mid個選手的圖,可持久化網路流?其實在加入每個選手以後都把圖存一遍就行了

1 #include 2 #include 3 #include 4 #include 5

#define l1 205

6#define n1 410

7#define m1 3050

8using

namespace

std;

9const

int inf=0x3f3f3f3f;10

11 template void read(_t &ret)

1215

while(c>='

0'&&c<='9')

16 ret=ret*fh;17}

1819

struct

edge

23}e,o[l1];

2425

intn,m,s,t,hd,tl;

26int

dep[n1],cur[n1],que[n1];

2728

int bfs(edge &e)

2942}43

return dep[t]!=-1;44

}45int dfs(edge &e,int x,int

limit)

4658}59

return

ans;60}

61int dinic(edge &e)

6267

68 vectorccf[l1];

69int

b[l1],a[l1][l1],want[l1];

7071

int solve(edge &e,int

x)72

88break;89

}90 memcpy(&o[x],&e,sizeof

(o[x]));

91return

i;92}93

94int

9596

int check(int limit,int

x)97

105void

init();

106107

void

_main_()

108120

for(i=1;i<=n;i++) printf("

%d ",real[i]); puts(""

);121

intl,r;

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

123126

while(l<=r)

127132

}133

for(i=1;i<=n;i++) printf("

%d );

134}

135136

inttt,cc;

137int

main()

138143

144void

init()

145

八省聯考2018 劈配

題目這題目,乍一眼看上去像乙個dp,因為這個資料範圍一般都是dp,但是考慮到轉移有後效性,所以顯然是做不了dp的。考試的時候像著怎麼設狀態沒有後效性,失敗了,就只打了乙個70分的暴力,還掛了20分。這題其實是個 網路流 匹配 真心看不出,然後我寫部落格的時候旁邊yl神犇看見了,嘲諷了我一波,我是真的...

八省聯考2018 劈配

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

八省聯考2018 劈配

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