题意:
给一个无向的双联通图...问最多留下多少条边使得每条边都没有共有顶点
二分图最大匹配=二分图最小点集覆盖(证明过程http://blog.csdn.net/wmn_wmn/article/details/7275648)
只需要求出图中最大匹配就行了,因为是无向图,最大匹配数/2;
#include<stdio.h>
#include<vector>
#include<cstring>
using namespace std;
const int N= 5001;
vector<int>g[N];
int link[N];
bool used[N];
int n;
int find(int u)
{
int size=g[u].size();
for(int i=0;i<size;i++)
{
int s=g[u][i];
if(!used[s])
{
used[s]=true;
if(link[s]==-1||find(s))
{
link[s]==u;
return 1;
}
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int ans=0;
scanf("%d",&n);
for(int i=1;i<=3*n/2;i++)
{
int a,b;
scanf("%d%d",&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
memset(link,-1,sizeof(link));
for(int i=1;i<=n;i++)
{
memset(used,false,sizeof(used));
if(find(i))
ans++;
}
printf("%d\n",ans/2);
}
return 0;
}