题目链接
http://poj.org/problem?id=3041
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 18023 | Accepted: 9808 |
Description
Input
Output
Sample Input
3 4 1 1 1 3 2 2 3 2
Sample Output
2题目意思就是给你n*n的网格,里面有k个小行星。现在有一道光束能消灭一整行或者一整列的行星,问你把左右的小行星都消灭需要多少光束。
这道题把光束当作图的顶点,把小行星当作连接对应光束的边。这下问题就变成了最小顶点覆盖问题,因为在二分图中最小顶点覆盖等于最大匹配。
AC代码:
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int n,p; int mp[550][550],vis[11000],link[11000]; int dfs(int star) { int i,j,k; for(i=1;i<=n;i++) { if(vis[i]==0 && mp[star][i]==1) { vis[i]=1; if(link[i]==0 || dfs(link[i])==1){ link[i]=star; return true; } } } return false; } int main() { memset(mp,0,sizeof(mp)); memset(link,0,sizeof(link)); int t,i,j,s,z,counts,m,k; int x,y; scanf("%d%d",&n,&k); for(i=0;i<k;i++) { scanf("%d%d",&x,&y); mp[x][y]=1; } counts=0; for(i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) counts++; } printf("%d\n",counts); }