這題一開始覺得能夠直接套最大獨立集模板,結果發現樣例都過不了。ios
看了discuss後有人說是n-m/2,由於要去掉搞基的= =瞬間嚇尿了,到如今還不知道他怎麼看出來的。ide
反正個人想法是由於題目輸入使配對重複,即A和B搞曖昧與B和A搞曖昧是同樣的,故求出最大匹配後要除二。spa
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <cstdlib> 6 #include <cstdio> 7 #include <string> 8 #include <vector> 9 #include <queue> 10 #include <cmath> 11 #include <stack> 12 //#include <map> 13 #include <cmath> 14 #include <set> 15 #include <climits> 16 #define INF 0x7fffffff 17 #define finc(i,a,b) for(i=a;i<=b;i++) 18 #define fdec(i,a,b) for(i=a;i>=b;i--) 19 #define MAXN 301 20 #define MAXM 100002 21 using namespace std; 22 int t; 23 int linker[550]; 24 int g[550][550]; 25 bool vis[550]; 26 bool dfs(int u) 27 { 28 int v; 29 finc(v,0,t-1){ 30 if(!vis[v]&&g[u][v]) 31 { 32 vis[v]=1; 33 if(linker[v]==-1||dfs(linker[v])) 34 { 35 linker[v]=u; 36 return true; 37 } 38 } 39 } 40 return false; 41 } 42 43 int hungary() 44 { 45 int u,res=0; 46 memset(linker,-1,sizeof(linker)); 47 finc(u,0,t-1){ 48 memset(vis,0,sizeof(vis)); 49 if(dfs(u)) res++; 50 } 51 return res; 52 } 53 54 int main() 55 { 56 int n,r,u,v,i,a,p,j; 57 while(~scanf("%d",&t)){ 58 memset(g,0,sizeof(g)); 59 finc(i,0,t-1) 60 { 61 scanf("%d: (%d)",&a,&n); 62 // cout<<a<<" "<<n<<endl; 63 finc(j,1,n) 64 { 65 scanf("%d",&p); 66 g[a][p]=1; 67 } 68 } 69 cout<<t-hungary()/2<<endl; 70 } 71 }
最經搞圖論RE.TLE.OLE特別多= =總是估錯範圍。。。code