码迷,mamicode.com
首页 > 其他好文 > 详细

【dfs】bzoj3563 DZY Loves Chinese

时间:2015-03-17 19:40:10      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

因为我们可以通过把某一行读到末尾来获取真正的K,所以把它和假K异或之后就是之前联通的次数(异或的逆运算为其本身)。最后一次的暴力一下。

#include<cstdio>
#include<cstring>
using namespace std;
#define N 100001
#define M 500001
int n,m,K,q,ans;
char s[1001];
bool del[M<<1];
int en,v[M<<1],first[N],next[M<<1],bs[20];
void AddEdge(int U,int V)
{
	v[++en]=V;
	next[en]=first[U];
	first[U]=en;
}
bool vis[N];
int cnt,RealK;
void dfs(int U)
{
	vis[U]=1; ++cnt;
	for(int i=first[U];i;i=next[i])
	  if((!vis[v[i]])&&(!del[i]))
	    dfs(v[i]);
}
int main()
{
	int A,B;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i)
	  {
	  	scanf("%d%d",&A,&B);
	  	AddEdge(A,B);
	  	AddEdge(B,A);
	  }
	scanf("%d",&q);
	for(int i=1;i<q;++i)
	  {
	  	scanf("%d",&K);
		RealK=0;
		gets(s);
		int len=strlen(s);
		for(int j=0;j<len;++j)
		  if(s[j]==‘ ‘)
		    ++RealK;
		if(i!=1)
		  {
		  	if((K^RealK)>ans) puts("Connected");
			else puts("Disconnected");
		  }
		ans=(K^RealK);
	  }
	scanf("%d",&K);
	RealK=0;
	while(scanf("%d",&bs[++RealK])!=EOF);
	if((K^(RealK-1))>ans) puts("Connected");
	else puts("Disconnected");
	ans=(K^(RealK-1));
	for(int i=1;i<RealK;++i)
	  del[((bs[i]^ans)<<1)-1]=del[(bs[i]^ans)<<1]=1;
	dfs(1);
	puts(cnt==n?"Connected":"Disconnected");
	return 0;
}

【dfs】bzoj3563 DZY Loves Chinese

标签:

原文地址:http://www.cnblogs.com/autsky-jadek/p/4345020.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!