uva 1613 Keep the Customer Satisfied

题意:在奇数点的无向图中,最大度为k,k是偶数,k++, 使用k种颜色去将所有的点进行染色,要求任意相邻的两个点不能相同

求一种染色方法

思路:

从任意一个点开始染色

然后dfs对每个点开始染色,每次染色保证这个点和周围相连的点颜色不相同,然后对与这个点相连的没有被染色的点进行染色,最后一定可以保证相连的点颜色不同

代码如下:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
using namespace std;
#define nmax 200010
int pnt[nmax],col[nmax],head[nmax],nxt[nmax];
int vis[nmax];
int c[nmax];
int cnt;
int k;
void addedge(int u,int v){
	pnt[cnt]=v;
	nxt[cnt]=head[u];
	head[u]=cnt++;
}
void dfs(int u){
	for(int i=head[u];i != -1;i = nxt[i]){
		int v = pnt[i];
		vis[col[v]]=u;
	}
	for(int i=1;i<=k;i++){
		if(vis[i]!=u){
			col[u]=i;
			break;
		}
	}
	for(int i=head[u];i!=-1;i=nxt[i]){
		int v = pnt[i];
		if(!col[v]){
			dfs(v);
		}
	}
}
int main()
{
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	int n,m;
	int t = 0;
	while(cin >> n >> m){
		if(t)cout  << '\n';
		t++;
		cnt = 0;
		memset(head,-1,sizeof head);
		memset(col,0,sizeof col);
		memset(c,0,sizeof c);
		k = 0;
		for(int i=1;i<=m;i++)
		{
			int u,v;cin >> u >> v;
			addedge(u,v);
			addedge(v,u);
			k = max(k,max(++c[u],++c[v]));
		}
		if(k%2==0)k++;
		dfs(1);
		cout << k << '\n';
		for(int i=1;i<=n;i++)cout << col[i] << '\n';
	}
	return 0;
}



你可能感兴趣的:(uva,第八章uva搞效算法设计)