POJ 3041 - Asteroids
在一个N*N的矩阵中 有K个障碍物, 每次使用武器 可以清除某行 或 某列 的障碍物
问最少使用多少次武器 可以清除所有的障碍物;
最小点集覆盖 = 最大匹配数
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <vector> 5 using namespace std; 6 const int maxn = 505; 7 vector<int> map[maxn]; 8 int link[maxn]; 9 int vis[maxn]; 10 int n,k; 11 bool dfs(int t) 12 { 13 int i,x,size=map[t].size(); 14 for(i=0;i<size;++i) 15 { 16 x=map[t][i]; 17 if(!vis[x]) 18 { 19 vis[x]=1; 20 if(link[x]==-1||dfs(link[x])) 21 { 22 link[x]=t; 23 return 1; 24 } 25 } 26 27 } 28 return 0; 29 } 30 int main() 31 { 32 int i,a,b,ans; 33 while(~scanf("%d%d",&n,&k)) 34 { 35 for(i=1;i<=n;i++) map[i].clear(); 36 for(i=1;i<=k;i++) 37 { 38 scanf("%d%d",&a,&b); 39 map[a].push_back(b); 40 } 41 ans=0; 42 memset(link,-1,sizeof(link)); 43 for(int i=1;i<=n;i++) 44 { 45 memset(vis,0,sizeof(vis)); 46 if(dfs(i)) ans++; 47 } 48 printf("%d\n",ans); 49 } 50 }
我自倾杯,君且随意