uva1613 K-Graph Oddity
阿新 • • 發佈:2018-10-05
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(intu,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