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

2022-05-19 20:31:00 字數 1573 閱讀 4818

從源到每乙個人連一條容量為 \(1\) 的邊。

從每乙個導師到匯連一條容量為導師戰隊人數的邊。

第一問我們依次列舉每乙個學員,然後再依次與第 \(1\)至 \(m\) 志願的老師連邊,如果與第 \(i\) 志願的導師連邊跑最大流使得最大流改變,說明找到了乙個導師與自己對應。自己的最小的能實現的志願就是 \(i\) 。如果找不到志願i的導師要把與志願i的導師連的邊刪掉。不刪聽說會t,一開始以為要推流,結果並不用。。。

第二問,我們可以二分需要高多少名。然後跟第一問做一樣的操作就行。但是我們需要知道處理完前 \(i\) 個學員的圖是什麼樣子的。

所以要用可持久化網路流??

因為資料範圍很小,我們可以直接把處理完第i個學員後的圖暴力存下。。。

然後這道題就解決了?

還有**要寫

#include#include#include#include#include#include#includeusing namespace std;

const int inf=1e9;

const int n=205;

struct edgee[n*2+n*n*2],hise[n][n*2+n*n*2];

int cnt,head[n*2],hiscnt[n],hishead[n][n*2];

void add_edge(int u,int v,int flow)

int dis[n*2];

bool bfs(int s,int t)

} }if(dis[t]==-1)return false;

return true;

}int dfs(int u,int t,int f)

} }if(used==0)dis[u]=-1;

return used;

}int ans,hisans[n];

void dinic(int s,int t)

int s,t;

void copy(int now)

vectorvec[n][n];

int s[n];

int n,m;

bool judge(int now,int pre)

while(ch>='0'&&ch<='9')

return sum*f;

}int tmp[n];

int main()

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

for(int i=1;i<=n;i++)s[i]=read();

copy(0);

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

}if(tmp[i]==0)copy(i),tmp[i]=m+1;

} for(int i=1;i<=n;i++)printf("%d ",tmp[i]);

printf("\n");

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

int l=1,r=i-1;

int ans=i;

while(l<=r)

printf("%d ",ans);

} printf("\n");

} return 0;

}

八省聯考2018 劈配

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

八省聯考2018 劈配

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

八省聯考2018 劈配

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