題目大意:略
先考慮第一問
直接跑最大流肯定是不好使的
考慮動態地進行這個過程
列舉每個選手,列舉每一等級的志願
把選手向當前志願內的每個導師都連流量為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 每人寫出乙份 並介紹自己的夢想。接著 由所...