1. 程式人生 > >BZOJ [Scoi2010]遊戲

BZOJ [Scoi2010]遊戲

== ont div highlight ons 遊戲 scanf 攻擊 cpp

題解:

解法一:建立圖論模型,發現只要聯通塊中有環則這個聯通塊中的值都可以被攻擊到

如果是樹,則只能攻擊size-1個

解法二:二分圖匹配,二分答案,看看是否能攻擊到mid

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int u=10000;

int n;

int father[u+1];
int isinc[u+1];
int siz[u+1];
int Getf(int x){
	if(father[x]==x)return x;
	return father[x]=Getf(father[x]);
}
void Unionn(int x,int y){
	int fx=Getf(x);
	int fy=Getf(y);
	if(fx!=fy){
		father[fx]=fy;
		siz[fy]+=siz[fx];
		isinc[fy]=isinc[fy]|isinc[fx];
	}
}


int main(){
	for(int i=1;i<=u;++i)father[i]=i;
	for(int i=1;i<=u;++i)siz[i]=1;
	scanf("%d",&n);
	while(n--){
		int x,y;
		scanf("%d%d",&x,&y);
		if(Getf(x)==Getf(y)){
			isinc[Getf(x)]=1;
		}else{
			Unionn(x,y);
		}
	}
	
	for(int i=1;i<=u;++i){
		int f=Getf(i);
		if(isinc[f])continue;
		if(siz[f]==1){
			printf("%d\n",i-1);
			return 0;
		}
		--siz[f];
	}
	printf("%d\n",u);
	return 0;
}

  

BZOJ [Scoi2010]遊戲