BZOJ 2079: [POI2010]GIL-Guilds

给定一张图,让对这张图进行染色,可以染黑,白,灰三种颜色。
要求:
1.黑点旁必须有一个白点;
2.白点旁必须有一个黑点;
3.灰点旁必须有一个白点,一个黑点。
问,是否能够染色成功。
显然,灰点是没有用的,并且,只要没有单独的一个点,那么就一定能成功,所以在特判有没有单独的一个点后,就成了一道简单构造题。O(n+e)的简单dfs即可。
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5,M=5e5+5; 
int n,m,u,v;
int du[N],ans[N];
bool vis[N];
int cnt,head[N];
struct edge{int next,to;}e[M<<1];

inline void add(int u,int v)
{
	cnt++;
	e[cnt].next=head[u];
	e[cnt].to=v;
	head[u]=cnt; 
}

void dfs(int u,int w)
{
	vis[u]=true;
	ans[u]=w;
	for (register int i=head[u]; i; i=e[i].next) if (!vis[e[i].to]) dfs(e[i].to,w^1);
}

int main(){
	scanf("%d%d",&n,&m);
	for (register int i=1; i<=m; ++i) 
	{
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
		du[u]++,du[v]++;
	}
	for (register int i=1; i<=n; ++i) if (!du[i]) {puts("NIE"); return 0;} 
	for (register int i=1; i<=n; ++i) if (!vis[i]) dfs(i,0);
	puts("TAK");
	for (register int i=1; i<=n; ++i) if (!ans[i]) {putchar('S'); putchar('\n');}
	else {putchar('K'); putchar('\n');} 
return 0;
}
发布了64 篇原创文章 · 获赞 29 · 访问量 688

猜你喜欢

转载自blog.csdn.net/Dove_xyh/article/details/103752920