/*
求最大匹配个数,无向图等于最大匹配/2;
此题有毒~~~我将最后的代码最后用一个solove函数写就过了,写在主函数下面就过不了 哈哈
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
using namespace std;
#define MAX 5010
vector<int>G[MAX];
bool vis[MAX];
int n,m;
int match[MAX];
int find(int x)
{ int nn=G[x].size(),i=0;
while(i<nn)
{ int v=G[x][i];
if(!vis[v])
{vis[v]=1;
if(match[v]==-1||find(match[v]))
{match[v]=x;return 1;}
}
i++;
}return 0;
}
int solove(){
int ans=0;
memset(match,-1,sizeof(match));
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(find(i))ans++;
}
return ans/2;//无向边,算了全部,除2
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{ scanf("%d",&n);
for(int i=1;i<=n;i++)
{G[i].clear();}
m=n*3/2;
while(m--)
{ int x,y;
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
int ans=solove();
printf("%d\n",ans);
}
return 0;
}
hdu1845
最新推荐文章于 2020-08-01 14:10:42 发布