一看题意就是二分匹配问题,建边是双向的,两个集合都是n个点
这题的图很特殊,每个点都要与三个点相连,在纸上画了六个点的图就感觉此图最大匹配肯定是六,除以2就是原图的匹配了,就感觉这样的图肯定会达到满匹配
一看数据5000个点,就用链表写了,还是超时,本来想在网上找份解题报告,看一下怎么优化的,却搜不到
就用自己的猜想,直接输出n/2,结果A了,,这尼玛什么题啊,,,
#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; } */