poj 3041 最小点覆盖=最大匹配

#include<stdio.h>
#include<string.h>
#define  N  510
int map[N][N],n,mark[N],link[N];
int find(int u) {
 int i;
 for(i=1;i<=n;i++)
 if(!mark[i]&&map[u][i]) {
    mark[i]=1;
    if(link[i]==-1||find(link[i])) {
        link[i]=u;
        return 1;
    }
 }
 return 0;
}
int main() {
     int i,j,k,s;
     while(scanf("%d%d",&n,&k)!=EOF) {
        memset(map,0,sizeof(map));
        for(i=1;i<=k;i++) {
            scanf("%d%d",&j,&s);
          map[j][s]=1;
        }
        k=0;
        memset(link,-1,sizeof(link));
        for(i=1;i<=n;i++) {
       memset(mark,0,sizeof(mark));
        k+=find(i);
        }
        printf("%d\n",k);
     }
return 0;
}
posted @ 2014-04-30 15:01  HYDhyd  阅读(114)  评论(0编辑  收藏  举报