一看題意就是二分匹配問題,建邊是雙向的,兩個集合都是n個點優化
這題的圖很特殊,每一個點都要與三個點相連,在紙上畫了六個點的圖就感受此圖最大匹配確定是六,除以2就是原圖的匹配了,就感受這樣的圖確定會達到滿匹配code
一看數據5000個點,就用鏈表寫了,仍是超時,原本想在網上找份解題報告,看一下怎麼優化的,卻搜不到string
就用本身的猜測,直接輸出n/2,結果A了,,這尼瑪什麼題啊,,,io
#include<stdio.h> int main() { int t,n,i,a,b; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n/2*3;i++) scanf("%d%d",&a,&b); printf("%d\n",n/2); } return 0; }
/* #include<stdio.h> #include<string.h> #define N 5001 int n,map[N][N],match[N],vis[N]; struct edge { int ed; edge *next; }*E[N]; void addedge(int x,int y) { edge *p=new edge; p->ed=y; p->next=E[x]; E[x]=p; } int find(int x) { int i; for(edge *p=E[x];p;p=p->next) { i=p->ed; if(vis[i]==0) { vis[i]=1; if(match[i]==-1||find(match[i])==1) { match[i]=x; return 1; } } } return 0; } int main() { int i,t,sum,x,y; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(E,NULL,sizeof(E)); for(i=1;i<=n/2*3;i++) { scanf("%d%d",&x,&y); addedge(x,y); addedge(y,x); } memset(match,-1,sizeof(match)); sum=0; for(i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); sum+=find(i); } printf("%d\n",sum/2); } return 0; } */