CodeForces 805E Ice cream coloring

直觉,构造。

画了几个样例,发现可以随便构造......先构造根节点的完全图,每个点置为不同的颜色,然后构造儿子节点的完全图......

#include <cstdio>
#include <cmath>
#include <set>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

int n,m;
const int maxn = 300010;
vector<int>g[maxn];
vector<int>d[maxn];
int f[maxn];
int ans[maxn],sz;

int t[maxn];

void dfs(int x)
{
	f[x]=1;

	int now = 1;
	for(int i=0;i<d[x].size();i++) 
	{
		int col = d[x][i];
		t[ans[col]]=1;
	}

	for(int i=0;i<d[x].size();i++)
	{
		int col = d[x][i];
		if(ans[col]) continue;

		while(1)
		{
			if(t[now]) now++;
			else 
			{
				ans[col] = now;
				t[now]=1;
				now++;
				break;
			}
		}

	}

	for(int i=0;i<d[x].size();i++) 
	{
		int col = d[x][i];
		t[ans[col]]=0;
	}


	for(int i=0;i<g[x].size();i++)
	{
		int to = g[x][i];
		if(f[to]) continue;
		dfs(to);
	}
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		int sz; scanf("%d",&sz);
		while(sz--)
		{
			int w; scanf("%d",&w);
			d[i].push_back(w);
		}
	}

	for(int i=1;i<n;i++)
	{
		int u,v; scanf("%d%d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
	}

	dfs(1);

	for(int i=1;i<=m;i++)
	{
		if(ans[i]==0) ans[i] = 1;
	}

	for(int i=1;i<=m;i++) sz = max(sz,ans[i]);
	printf("%d
",sz);
	for(int i=1;i<=m;i++) printf("%d ",ans[i]);
	printf("
");

	return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/6844968.html