题意:给你一个无向图,求最大匹配。双向边都需要连起来,ans=maxmatch/2;
Sample Input
2
4
1 2
1 3
1 4
2 3
2 4
3 4
4
1 2
1 3
1 4
2 3
2 4
3 4
Sample Output
2
2
#include <map>
#include <cmath>
#include <iostream>
#include <cstring>
#define m(a,b) memset(a,b,sizeof a)
#define inf 0x3f3f3f3f
typedef long long ll;
typedef double du;
using namespace std;
const int N=5000+5;
const int M=400+5;
const int INF=0x3f3f3f3f;
int head[N],mt[N];
int vis[N],tot;
struct Edge{int to,nex;}edge[N*3];
void add(int from,int to)
{
edge[++tot]=(Edge){to,head[from]};head[from]=tot;
edge[++tot]=(Edge){from,head[to]};head[to]=tot;
}
int find_path(int x)
{
for(int i=head[x];i;i=edge[i].nex)
{
int y=edge[i].to;
if(!vis[y])
{
vis[y]=1;
if(!mt[y]||find_path(mt[y]))
{
mt[y]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
m(head,0),m(mt,0);
tot=1;
int n;
scanf("%d",&n);
int cnt=n*3/2;
while(cnt--)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
int ans=0;
for(int i=1;i<=n;i++)
{
m(vis,0);
if(find_path(i))
ans++;
}
printf("%d\n",ans/2);
}
}