ural 1208. Legendary Teams Contest

给你几队,每队三个队员,但是可能有重复。一个队员只能属于一个队,问你最多几个队不冲突。

 

如果每队两个队员,那就是二分图最大匹配啦~~

 

这样的话,直接搜就好了。直接搜每个队成立的话然后取哪几个队。

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <algorithm> #include <math.h> using namespace std; const int MAX = 25; typedef struct STR{ int a[3]; }STR; STR team[MAX]; char str[MAX*3][MAX]; int n,num; bool used[MAX*3],flag[MAX]; int sum,maxsum; int find( char *s ) { for(int i=0; i<num; i++) if( strcmp(s,str[i]) == 0 ) return i; return -1; } bool check(int x) { for(int i=0; i<3; i++) if( used[team[x].a[i]] ) return false; return true; } void fff(int x,int v) { for(int i=0; i<3; i++) used[team[x].a[i]] = v; } void DFS(int x) { if( sum > maxsum ) maxsum = sum; for(int i=x; i<n; i++) // 如果从0开始,就TLE了 if( !flag[i] && check(i) ) { sum++; flag[i] = true; fff(i,1); DFS(i); flag[i] = false; fff(i,0); sum--; } } int main() { char s[MAX]; num = 0; scanf("%d",&n); for(int i=0; i<n; i++) { for(int k=0; k<3; k++) { scanf("%s",s); int ind = find(s); if( ind == -1 ) { ind = num; num++; memcpy(str[ind],s,sizeof(s)); } team[i].a[k] = ind; } } maxsum = 1; for(int i=0; i<n; i++) { memset(used,false,sizeof(used)); memset(flag,false,sizeof(flag)); flag[i] = true; sum = 1; for(int k=0; k<3; k++) used[team[i].a[k]] = true; DFS(i); } printf("%d/n",maxsum); return 0; }

你可能感兴趣的:(struct)