nyoj 237 遊戲高手的煩惱

題目鏈接: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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章