POJ 3041 Asteroids (对偶性,二分图匹配)
生活随笔
收集整理的這篇文章主要介紹了
POJ 3041 Asteroids (对偶性,二分图匹配)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:POJ 3041 Asteroids?http://poj.org/problem?id=3041
分析:
把位置下標看出一條邊,這顯然是一個二分圖最小頂點覆蓋的問題,Hungary就好。
挑戰:
輸出一組可行解。構造,已知二分圖的兩個點集U和V,s-U-V-t,在最大匹配的殘留網絡里,選從s出發能到達的V中的點
沿途可以到達的U集中的點的路徑就都被覆蓋了,然后在選擇U集合中無法到達的點。對于二分圖中任意一條邊,其中必有一點屬于U集合,
所以前面選出的點集S是一個覆蓋。并且S中V和U對應的匹配邊是相斥的,總數確實等于總匹配邊數。(更具體的,可以想想U是怎么劃分的。)
如果最大匹配數記為M,最小點覆蓋記為C。那么的構造還可以說明M≥C。又因為匹配邊是平行的,所以至少要M個點才能覆蓋,C≥M。這樣
就得出了M = C的結論。
Code
/********************************************************* * ------------------ * * author AbyssalFish * **********************************************************/ #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<queue> #include<vector> #include<stack> #include<vector> #include<map> #include<set> #include<algorithm> #include<cmath> using namespace std;typedef long long ll;const int maxn = 501, maxm = 1e4+1; int hd[maxn],to[maxm],nx[maxm],ec; #define eachEage int i = hd[u]; i; i = nx[i] void add(int u,int v) {nx[++ec] = hd[u];to[ec] = v;hd[u] = ec; }int link[maxn]; int vis[maxn], clk;bool dfs(int u) {vis[u] = clk;for(eachEage){int v = to[i], w = link[v];if(!w || (vis[w]!=clk && dfs(w))){link[v] = u;return true;}}return false; }//#define LOCAL int main() { #ifdef LOCALfreopen("in.txt","r",stdin); #endifint n,k; scanf("%d%d",&n,&k);for(int i = 0; i < k; i++){int r, c;scanf("%d%d",&r,&c);add(r,c);}int ans = 0;for(int i = 1; i <= n; i++){clk++;if(dfs(i)) ans++;}printf("%d\n", ans);return 0; }?
轉載于:https://www.cnblogs.com/jerryRey/p/4947414.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的POJ 3041 Asteroids (对偶性,二分图匹配)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CPC客户端编写新申请时报错异常来自 H
- 下一篇: 项目经验:某大厂大数据项目总结