题目大意:中文题。
算法思路:匈牙利算法的模板题,一开始用邻接矩阵做,结果超时了,后来一看,有10000的边数,难怪超时,因为要判定两点是否有边的话,就得遍历一行,每次递归都这样做的话时间花费是很大的,就改为了邻接表,过了。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f3f
#define MAXN 505
int t,n,k,a,b,e;
int maps[MAXN*4][MAXN*4],next[20050],match[MAXN],head[MAXN];
bool visited[MAXN*4];
typedef struct Edge
{
int u;
int v;
int c;
};
Edge edges[20050];
void addNode(int u,int v,int c)
{
edges[e].u=u;
edges[e].v=v;
edges[e].c=c;
next[e]=head[u];
head[u]=e++;
}
int dfs(int p)
{
int t;
for(int i=head[p];i+1;i=next[i])
{
if(edges[i].v!=0&&!visited[edges[i].v])
{
visited[edges[i].v]=true;
t=match[edges[i].v];
match[edges[i].v]=p;
if(t==-1||dfs(t))
{
return 1;
}
match[edges[i].v]=t;
}
}
return 0;
}
int main()
{
int res;
scanf("%d",&t);
while(t--)
{
memset(visited,false,sizeof(visited));
res=0;
scanf("%d%d",&n,&k);
e=0;
memset(head,-1,sizeof(head));
memset(next,-1,sizeof(next));
for(int i=1;i<=k;i++)
{
scanf("%d%d",&a,&b);
addNode(a,b,1);
}
memset(match,-1,sizeof(match));
for(int i=1;i<=n;i++)
{
memset(visited,false,sizeof(visited));
res+=dfs(i);
}
printf("%d\n",res);
}
return 0;
}