二分图最小点覆盖
搞清楚 最大匹配,二分图,增广路
模板不长,搞清楚为什么。。。算法懂了,以后还要继续学习,很多细节不懂,还要学会证明!!
http://www.cnblogs.com/budapeng/p/3273293.html
跟着算法走一遍,很好懂。。
#include <iostream> #include <stdio.h> #include <string.h> #define MAX 1505 using namespace std; int vis[MAX],fa[MAX],head[MAX],tot; struct node { int u,v,next; }edge[MAX<<1]; void init() { memset(head,-1,sizeof(head)); memset(fa,-1,sizeof(fa)); tot=0; } void addedge(int u,int v) { edge[tot].u=u; edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } int dfs(int u) { for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(!vis[v]) { vis[v]=1; if(fa[v]==-1||dfs(fa[v])) { fa[v]=u; return 1; } } } return 0; } int main() { //freopen("t.txt","r",stdin); int n,c,res,a,b; while(scanf("%d",&n)!=EOF) { init(); res=0; for(int i=0;i<n;i++) { scanf("%d:(%d)",&a,&c); for(int j=0;j<c;j++) { scanf("%d",&b); addedge(a,b); addedge(b,a); } } for(int i=0;i<n;i++) { if(head[i]!=-1) { memset(vis,0,sizeof(vis)); res=res+dfs(i); } } printf("%d\n",res/2); } return 0; }