题意:在奇数点的无向图中,最大度为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; }