1. 程式人生 > >uva1613 K-Graph Oddity

uva1613 K-Graph Oddity

n-1 style 然而 iostream stream ons oid cout head

題目要求k>=最大度數;
觀察,顏色數量和度數的關系,得顏色數=最大度數+1(偶數)//最大度數(奇數) 可以滿足染色關系
一個點和周圍的點的顏色數加起來最大為它的度數+1;
 k=所有點中最大的度。如果最大入度是偶數,則k+1。
證明:當最大度數為奇數n,設點u所連n個點,點u為1,n-1個點不一樣,1個點和某個點相同(2-n),那麽其他n-1個點可以相連,度數n-2+1=n-1,如果再連這個相同點,度數為n;然而此時一共有n+1個點,為偶數,所以要再加一個點
如果加到這個點(新的n),最大度數改變,不可以;加到其他點,也不能超過n,所以一定有兩個點沒有直接相連,交換沒有直接相連的點和(新的n那個點),就滿足了條件
策略:dfs

k = (max(deg+1,deg+1+n))|1;

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 10000;
const int maxm = 200000;  //為啥開這麽大....用100005re

int head[maxn],to[maxm],nxt[maxm],col[maxn],ecnt,deg[maxn];
int vis[maxn];
int k;
void addEdge(int
u,int v) { deg[u]++; k=max(k,deg[u]); to[ecnt] = v; nxt[ecnt] = head[u]; head[u] = ecnt++; } void dfs(int u) { for(int i = head[u]; i!=-1; i= nxt[i]) vis[col[to[i]]] = u; //u的連接點的顏色都標記為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]){ if(col[to[i]]) continue; dfs(to[i]); } } int main() { int n,m; while(scanf("%d",&n)==1){ k=0; scanf("%d",&m); memset(head,-1,sizeof(head)); memset(deg,0,sizeof(deg)); memset(col,0,sizeof(col)); ecnt = 0; while(m--){ int u,v; scanf("%d %d",&u,&v); addEdge(u,v); addEdge(v,u); } k = k|1; memset(vis,0,sizeof(vis)); dfs(1); printf("%d\n",k); for(int i = 1; i <= n; i++) printf("%d\n",col[i]); cout<<endl; } return 0; }

uva1613 K-Graph Oddity