poj 3041 Asteroids(二分图最小顶点覆盖)
题目:http://poj.org/problem?id=3041
把X作为n1点集,y作为n2点集,x->y建立二分图,最小顶点覆盖。。
View Code
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int n,k; 6 int map[505][505]; 7 int vis[505]; 8 int link[505]; 9 int find(int x) 10 { 11 int i; 12 for(i=1;i<=n;i++) 13 { 14 if(map[x][i]&&!vis[i]) 15 { 16 vis[i]=1; 17 if(link[i]==0||find(link[i])) 18 { 19 link[i]=x; 20 return 1; 21 } 22 } 23 } 24 return 0; 25 } 26 int main() 27 { 28 int x,y,i; 29 scanf("%d%d",&n,&k); 30 memset(map,0,sizeof(map)); 31 for(i=0;i<k;i++) 32 { 33 scanf("%d%d",&x,&y); 34 map[x][y]=1; 35 } 36 int num=0; 37 for(i=1;i<=n;i++) 38 { 39 memset(vis,0,sizeof(vis)); 40 if(find(i)) 41 num++; 42 } 43 printf("%d\n",num); 44 return 0; 45 }