POJ 3041 Asteroids(二分图匹配)
最大二分图匹配 = 最小点覆盖。。。上匈牙利模版。。
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 int p[501][501],used[501],linker[501]; 5 int n; 6 int dfs(int x) 7 { 8 int i; 9 for(i = 1; i <= n; i ++) 10 { 11 if(p[x][i]&&!used[i]) 12 { 13 used[i] = 1; 14 if(!linker[i]||dfs(linker[i])) 15 { 16 linker[i] = x; 17 return 1; 18 } 19 } 20 } 21 return 0; 22 } 23 int main() 24 { 25 int i,m,sv,ev,ans; 26 scanf("%d%d",&n,&m); 27 memset(linker,0,sizeof(linker)); 28 for(i = 1; i <= m; i ++) 29 { 30 scanf("%d%d",&sv,&ev); 31 p[sv][ev] = 1; 32 } 33 ans = 0; 34 for(i = 1; i <= n; i ++) 35 { 36 memset(used,0,sizeof(used)); 37 if(dfs(i)) 38 ans ++; 39 } 40 printf("%d\n",ans); 41 return 0; 42 }