nicholas

nicholas
pku 1087

pku1087   最大匹配 注意数据规模 不然nare


#include <iostream>
#include <string>
using namespace std;
#define MAXN 410
#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)

int hungary(int m,int n,int mat[][MAXN],int* match1,int* match2){
 int s[MAXN],t[MAXN],p,q,ret=0,i,j,k;
 for (_clr(match1),_clr(match2),i=0;i<m;ret+=(match1[i++]>=0))
  for (_clr(t),s[p=q=0]=i;p<=q&&match1[i]<0;p++)
   for (k=s[p],j=0;j<n&&match1[i]<0;j++)
    if (mat[k][j]&&t[j]<0){
     s[++q]=match2[j],t[j]=k;
     if (s[q]<0)
      for (p=j;p>=0;j=p)
       match2[j]=k=t[j],p=match1[k],match1[k]=j;
    }
 return ret;
}

int mat[MAXN][MAXN],f[MAXN][MAXN],match1[MAXN],match2[MAXN];

string name[2][MAXN];
int num[2];
int n,m,k;


int find(string s,int k)
{
 int i=0;
 while (name[k][i]!=s && i<num[k]) i++;

 if (i<num[k]) return i;
 else
 {
  name[k][i]=s;
  num[k]++;
 }
 return num[k]-1;
}


void init()
{
 string s,s1,s2;
 string ad[MAXN][2];
 int i,j,p,q;

 num[0]=0;
 num[1]=0;


 memset(mat,0,sizeof(mat));
 memset(f,0,sizeof(f));
 

 //cin>>n;
 for (i=0;i<n;i++)
 {
  cin>>s;
  j=find(s,1);
 }

 cin>>m;
 for (i=0;i<m;i++)
 {
  cin>>s1>>s2;
  p=find(s1,0);
  q=find(s2,1);
  mat[p][q]=1;
 
 }

 cin>>k;
 for (i=0;i<k;i++)
 {
  cin>>s1>>s2;
  ad[i][0]=s1;
  ad[i][1]=s2;
    }
    int flag=1;
    while (flag)
    {
            flag=0;
            memset(f,0,sizeof(f));
           
            for (i=0;i<k;i++)
            {
             
                s1=ad[i][0];
                s2=ad[i][1];
                 
          p=find(s1,1);
          q=find(s2,1);
          for (j=0;j<num[0];j++)
          {
           int x=mat[j][p] || mat[j][q];
                   
                    if (x>0)   f[j][q]=x;
           
          }
          
         
            }
               for (p=0;p<num[0];p++)
            for (q=0;q<num[1];q++)
            {
                      if (mat[p][q]==0&&f[p][q]==1) flag=1;
               
                      mat[p][q]=mat[p][q] || f[p][q];
                   }
             
  
 }

     
}

 

int main()
{
 while (cin>>n)
 {
 init();
 int x=hungary(num[0],n,mat,match1,match2);
 cout<<m-x<<endl;

 }
 return 0;
}


 

posted on 2007-09-06 17:11  zy_nic  阅读(493)  评论(1)    收藏  举报