uva 11419(最大匹配,最小点覆盖)
2013-03-19 14:32
330 查看
Problem C
SAM I AM
Input: Standard Input
Output: Standard Output
The world is in great danger!! Mental's forces have returned to Earth to eradicate humankind. Our last hope to stop this great evil is
Sam “Serious” Stone. Equipped with various powerful weapons, Serious Sam starts his mission to destroy the forces of evil.
After fighting two days and three nights, Sam is now in front of the temple KOPTOS where Mental's general Ugh Zan III is waiting for him. But this time, he has a serious problem. He is in shortage of ammo and a lot of enemies crawling inside the temple waiting
for him. After rounding the temple Sam finds that the temple is in rectangle shape and he has the locations of all enemies in the temple.
All of a sudden he realizes that he can kill the enemies without entering the temple using the great cannon ball which spits out a gigantic ball bigger than him killing anything it runs into and keeps on rolling until it finally explodes. But the cannonball
can only shoot horizontally or vertically and all the enemies along the path of that cannon ball will be killed.
Now he wants to save as many cannon balls as possible for fighting with Mental. So, he wants to know the minimum number of cannon balls and the positions from which he can shoot the cannonballs to eliminate all enemies from outside that temple.
inside the temple. After that there are N lines each of which contains 2 integers representing the position of the enemies in that temple. Each test case is followed by a new line (except the last one). Input is terminated when R=C=N=0. The size of the input
file is around 1.3 MB.
m positions from which he can shoot those cannonballs. For shooting horizontally print “r” followed by the row number and for vertical shooting print “c” followed by the column number. If there is
more than one solution any one will do.
Problemsetter: Syed Monowar Hossain
Special Thanks: Derek Kisman
本题是道经典的最小点覆盖模型的题目,在棋盘格中这种分行列的建图方法还是很常见的。
然后就是要用到定理:最小覆盖数等于最大匹配数。(最小点覆盖,即选择最少的点,使得每条边至少有一个端点被选中)
简单证明如下:1.最大匹配数>=最小覆盖数,假设已经求得了最大匹配,而在最大匹配选择了的边之外,还存在一条边的两个端点都没被选中,则这条边一定会在求最大匹配时被选中,与假设矛盾
2.最大匹配数<=最小覆盖数,因为最小点覆盖就是要求每条边至少有一个端点被选中,所以最大匹配时被选的那些边,都至少要有一个点被覆盖。
由1,2可得证定理。
构造最小覆盖的解书上有讲述,也没花时间去想,直接套了模版。
SAM I AM
Input: Standard Input
Output: Standard Output
The world is in great danger!! Mental's forces have returned to Earth to eradicate humankind. Our last hope to stop this great evil is
Sam “Serious” Stone. Equipped with various powerful weapons, Serious Sam starts his mission to destroy the forces of evil.
After fighting two days and three nights, Sam is now in front of the temple KOPTOS where Mental's general Ugh Zan III is waiting for him. But this time, he has a serious problem. He is in shortage of ammo and a lot of enemies crawling inside the temple waiting
for him. After rounding the temple Sam finds that the temple is in rectangle shape and he has the locations of all enemies in the temple.
All of a sudden he realizes that he can kill the enemies without entering the temple using the great cannon ball which spits out a gigantic ball bigger than him killing anything it runs into and keeps on rolling until it finally explodes. But the cannonball
can only shoot horizontally or vertically and all the enemies along the path of that cannon ball will be killed.
Now he wants to save as many cannon balls as possible for fighting with Mental. So, he wants to know the minimum number of cannon balls and the positions from which he can shoot the cannonballs to eliminate all enemies from outside that temple.
Input
Here, the temple is defined as a RXC grid. The first line of each test case contains 3 integers: R(0<R<1001), C(0<C<1001) representing the grid of temple (R means number of row and C means number of column of the grid) and the number of enemies N(0<N<1000001)inside the temple. After that there are N lines each of which contains 2 integers representing the position of the enemies in that temple. Each test case is followed by a new line (except the last one). Input is terminated when R=C=N=0. The size of the input
file is around 1.3 MB.
Output
For each test case there will be one line output. First print the minimum number (m) of cannonballs needed to wipe out the enemies followed by a single space and thenm positions from which he can shoot those cannonballs. For shooting horizontally print “r” followed by the row number and for vertical shooting print “c” followed by the column number. If there is
more than one solution any one will do.
Sample Input Output for Sample Input
4 4 3 1 1 1 4 3 2 4 4 2 1 1 2 2 0 0 0 | 2 r1 r3 2 r1 r2 |
Special Thanks: Derek Kisman
本题是道经典的最小点覆盖模型的题目,在棋盘格中这种分行列的建图方法还是很常见的。
然后就是要用到定理:最小覆盖数等于最大匹配数。(最小点覆盖,即选择最少的点,使得每条边至少有一个端点被选中)
简单证明如下:1.最大匹配数>=最小覆盖数,假设已经求得了最大匹配,而在最大匹配选择了的边之外,还存在一条边的两个端点都没被选中,则这条边一定会在求最大匹配时被选中,与假设矛盾
2.最大匹配数<=最小覆盖数,因为最小点覆盖就是要求每条边至少有一个端点被选中,所以最大匹配时被选的那些边,都至少要有一个点被覆盖。
由1,2可得证定理。
构造最小覆盖的解书上有讲述,也没花时间去想,直接套了模版。
#include <cstdio> #include <string> #include <cstring> #include <queue> #include <algorithm> #include <iostream> using namespace std; const int maxn = 1000 + 5; struct BPM{ int n,m; vector<int > G[maxn]; int left[maxn]; bool T[maxn]; int right[maxn]; bool S[maxn]; void init(int n,int m){ this -> n = n; this -> m = m; for(int i = 0;i < maxn;i++) G[i].clear(); } void AddEdge(int u,int v){ G[u].push_back(v); } bool match(int u){ S[u] = true; for(int i = 0;i < G[u].size();i++){ int v = G[u][i]; if(!T[v]){ T[v] = true; if(left[v] == -1 || match(left[v])){ left[v] = u; right[u] = v; return true; } } } return false; } int solve(){ memset(left,-1,sizeof(left)); memset(right,-1,sizeof(right)); int ans = 0; for(int u = 0;u < n;u++){ memset(S,0,sizeof(S)); memset(T,0,sizeof(T)); if(match(u)) ans++; } return ans; } int mincover(vector<int>& X,vector<int>& Y){ int ans = solve(); memset(S,0,sizeof(S)); memset(T,0,sizeof(T)); for(int u = 0;u < n;u++) if(right[u] == -1) match(u); for(int u = 0;u < n;u++) if(!S[u]) X.push_back(u); for(int v = 0;v < n;v++) if(T[v]) Y.push_back(v); return ans; } }; BPM solver; int main(){ int n,r,c; while(scanf("%d%d%d",&r,&c,&n)){ if(r == 0 && c == 0 && n == 0) break; solver.init(r,c); while(n--){ int x,y; scanf("%d%d",&x,&y);x--;y--;//模版中编号是从0开始的 solver.AddEdge(x,y); } vector<int> X,Y; printf("%d",solver.mincover(X,Y)); for(int i = 0;i < X.size();i++) printf(" r%d",X[i]+1);//最后别忘了加回来 for(int j = 0;j < Y.size();j++) printf(" c%d",Y[j]+1); printf("\n"); } return 0; }
相关文章推荐
- uva 11419(二分图最大匹配--最小点覆盖)
- uva11419 【最大二分匹配求最小点覆盖 匈牙利算法】
- uva 11419 最大匹配数等于最小覆盖数
- 二分图最大匹配与最小顶点覆盖(教程系列)uva11419——我目前关于最大匹配最清晰的解释。
- UVA 11419 SAM I AM(最大二分匹配&最小点覆盖:König定理)
- Taxi Cab Scheme UVALive - 3126 最小路径覆盖解法(必须是DAG,有向无环图) = 结点数-最大匹配
- uva 1201 最小路径覆盖 最大匹配
- UVa live6492Welcome Party(二分最大匹配之最小点覆盖)
- UVa 11419 二分图最小点覆盖
- 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
- hdu1350——Taxi Cab Scheme——————【最小路径覆盖、最大匹配转化】
- POJ3041 最小点覆盖 最大匹配数 回顾匈牙利算法
- 树形DP 或 最小顶点覆盖=最大匹配(双向图)(HDU 1053)
- POJ3692——Kindergarten (二分图求最小顶点覆盖 (即最大匹配))
- uva11419 SAM I AM(最小顶点覆盖+输出顶点)
- 【杭电1498】50years,50colors二分最大匹配--最小点覆盖
- 最小点集覆盖==最大匹配 证明
- poj 1325 Machine Schedule(最小点覆盖即最大匹配,匈牙利算法)
- poj3041 最小点覆盖==二分图最大匹配 匈牙利算法求解最大匹配问题(运用DFS)
- [POJ3020]Antenna Placement(二分图最大匹配,最小边覆盖)