http://acm.hdu.edu.cn/showproblem.php?pid=1150
最小顶点覆盖
View Code
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=150; 6 int g[N][N],n,m; 7 int mat[N],vis[N]; 8 bool match(int u) 9 { 10 for(int v=1;v<m;v++) 11 if(g[u][v] && !vis[v]) 12 { 13 vis[v]=1; 14 if(mat[v]==-1 || match(mat[v])) 15 { 16 mat[v]=u; 17 return 1; 18 } 19 } 20 return 0; 21 } 22 int maxmatch() 23 { 24 int cnt=0; 25 memset(mat,-1,sizeof(mat)); 26 for(int i=1;i<n;i++) 27 { 28 memset(vis,0,sizeof(vis)); 29 if(match(i)) cnt++; 30 } 31 return cnt; 32 } 33 int main() 34 { 35 int k; 36 while(scanf("%d%d%d",&n,&m,&k)==3) 37 { 38 memset(g,0,sizeof(g)); 39 for(int i=0;i<k;i++) 40 { 41 int u,v,x; 42 scanf("%d%d%d",&x,&u,&v); 43 g[u][v]=1; 44 } 45 int ans=maxmatch(); 46 printf("%d\n",ans); 47 } 48 return 0; 49 }