POJ3041 二分图最小点覆盖(匈牙利算法)

来源:互联网 发布:节奏大师没有网络可用 编辑:程序博客网 时间:2024/06/06 00:59
#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=600;bool line[maxn][maxn],used[maxn];int target[maxn],c,r,n,m,all;bool found(int x){    int i,j;    for(j=1;j<=c;j++)    {        if(line[x][j]==true&&used[j]==false)        {            used[j]=true;            if(target[j]==0||found(target[j]))            {                target[j]=x;                return true;            }        }    }    return false;}int main(){  while(scanf("%d%d",&c,&r)!=EOF)  {      memset(line,false,sizeof(line));      memset(target,0,sizeof(target));      all=0;      for(int i=1;i<=r;i++)      {          scanf("%d%d",&n,&m);          line[n][m]=true;      }      for(int i=1;i<=c;i++)      {          memset(used,false,sizeof(used));          if(found(i))            {all+=1;}      }      printf("%d\n",all);  }  return 0;}///直接将x y看成两个结点。二分图:最大匹配数=最小定点覆盖

阅读全文
0 0
原创粉丝点击