題目鏈接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237
此題大意爲:有個n行n列的陣列,然後裏面有些格子裏有怪物,某個人一次能消滅掉某一行或某一列全部的怪物,問最少需要多少次才能消滅完;
//////////////////////////////////////////////////////////////
此題爲簡單的二分圖最大匹配題, 最小頂點覆蓋=二分圖最大匹配
需要注意的是存圖的時候不要用鄰接矩陣,否則會超時,我用的是鄰接表,順便練下鏈表的操作;
////////////////////////////
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int flag[1000];
int res[1000];
int n,v;
int num;
struct node
{
int n;
node *next;
}a[1000];
void add(int u,int b)//向鄰接表中增加邊
{
node *p;
p=&a[u];
while(p->next)
p=p->next;
p->next=(node *)malloc(sizeof(node));
p=p->next;
p->n=b;
p->next=NULL;
}
int fin(int u) //匈牙利算法主函數
{
node *p=&a[u];
p=p->next;
while(p)
{
if(flag[p->n]==0)
{
flag[p->n]=1;
if(res[p->n]==0||fin(res[p->n]))
{
res[p->n]=u;
return 1;
}
}
p=p->next;
}
return 0;
}
void execute()
{
scanf("%d%d",&n,&v);
int u,b;
int i;
memset(a,0,sizeof(a));
node *p;
for(i=0;i<v;i++)
{
scanf("%d%d",&u,&b);
add(u,b);
}
int ans=0;
memset(res,0,sizeof(res));
for(i=1;i<=n;i++)
{
memset(flag,0,sizeof(flag));
if(fin(i))
ans++;
}
printf("%d\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
execute();
return 0;
}