luogu P1640 [SCOI2010]连续攻击游戏

题目传送门:https://www.luogu.org/problemnew/show/P1640



题意:

有n个武器,每一个武器都有两个属性,现在要求你可以任选某一个武器中的任意一个属性(有且只能选一个),求你最多可以选多少个属性,使它们的值是连续的。



思路:

二分图匹配。

注意:一旦无法找到连续的匹配就break。


扫描二维码关注公众号,回复: 64717 查看本文章


代码:

#include<cstdio>
#include<cstring>
	struct node{int x,y,next;} a[2000010];
	bool bz[1000010];
	int last[1000010],match[1000010];
	int m,len=0,ans;
void ins(int x,int y)
{
	a[++len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len;
}
bool find(int x)
{
	for(int i=last[x];i;i=a[i].next)
	{
		int y=a[i].y;
		if(bz[y])
		{
			bz[y]=false;
			if(!match[y]||find(match[y]))
			{
				match[y]=x;
				return true;
			}
		}
	}
	return false;
}
int main()
{	
	int x,y;
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d",&x,&y);
		ins(x,i);
		ins(y,i);
	}
	for(int i=1;i<=10000;i++)
	{
		memset(bz,true,sizeof(bz));
		if(find(i)) ans++; else break;
	}
	printf("%d",ans);
}

猜你喜欢

转载自blog.csdn.net/zsyz_ZZY/article/details/80080839