代码如下:
1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 using namespace std; 5 6 struct node 7 { 8 char cc[7],dd[7]; 9 }cat[1000],dog[1000]; 10 11 vector<int> match[1000]; 12 int vis[1000]; 13 int link[1000]; 14 int n,m,k; 15 16 bool can(int x) 17 { 18 int len = match[x].size(); 19 for(int i = 0;i < len;i ++) 20 { 21 int t = match[x].at(i); 22 if(!vis[t]) 23 { 24 vis[t] = 1; 25 if(link[t] == -1 || can(link[t])) 26 { 27 link[t] = x; 28 return true; 29 } 30 } 31 } 32 33 return false; 34 } 35 36 int maxmatch() 37 { 38 int num = 0; 39 for(int i = 0;i < k;i ++) 40 { 41 memset(vis,0,sizeof(vis)); 42 if(can(i)) 43 num ++; 44 } 45 46 return num; 47 } 48 49 int main() 50 { 51 int cas; 52 scanf("%d",&cas); 53 while(cas --) 54 { 55 scanf("%d%d%d",&n,&m,&k); 56 memset(link,-1,sizeof(link)); 57 for(int i = 0;i < k;i ++) 58 { 59 match[i].clear(); 60 } 61 char ss1[5],ss2[5]; 62 int catnum = 0,dognum = 0; 63 for(int i = 0;i < k;i ++) 64 { 65 scanf("%s%s",ss1,ss2); 66 if(ss1[0] == 'C') 67 { 68 strcpy(cat[catnum].cc,ss1); 69 strcpy(cat[catnum].dd,ss2); 70 catnum ++; 71 } 72 else 73 { 74 strcpy(dog[dognum].cc,ss1); 75 strcpy(dog[dognum].dd,ss2); 76 dognum ++; 77 } 78 } 79 for(int i = 0;i < catnum;i ++) 80 { 81 for(int j = 0;j < dognum;j ++) 82 { 83 if(!strcmp(cat[i].cc,dog[j].dd)||!strcmp(cat[i].dd,dog[j].cc)) 84 { 85 match[i].push_back(j); 86 //match[j].push_back(i); 87 } 88 } 89 } 90 91 printf("%d\n",k - maxmatch()); 92 } 93 94 return 0; 95 }
看了别人的代码才会写的。