UVA 1613 K-Graph Oddity K度图着色 (构造)
生活随笔
收集整理的這篇文章主要介紹了
UVA 1613 K-Graph Oddity K度图着色 (构造)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:在一個n個點的無向連通圖中,n是奇數,k是使得所有點的度數不超過k的最小奇數,詢問一種染色方案,使得相鄰點的顏色不同。
題解:一個點和周圍的點的顏色數加起來最大為它的度數+1;如果最大度數是偶數,那么k種顏色一定夠了。如果最大度數是奇數,而且n是奇數,那么k種顏色也一定是足夠的。 可以反證,最大度數的點是u,deg[u]是奇數,而且和u相鄰的點顏色各不相同,那么與u的一個相鄰點v,至少和deg[u]個顏色不同的點相鄰,這樣構造出來連通圖點數一定是偶數,和n是奇數是矛盾的,所以不會出現顏色數為deg[u]+1的情況。
所以只要染色就好了。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e4; const int maxm = 2e5+5;int head[maxn],to[maxm],nxt[maxm],col[maxn],ecnt,deg[maxn]; int vis[maxn];void addEdge(int u,int v) {deg[u]++;to[ecnt] = v;nxt[ecnt] = head[u];head[u] = ecnt++; } int k;void dfs(int u) {for(int i = head[u]; ~i; i= nxt[i]){vis[col[to[i]]] = u;}for(int i = 1; i <= k; i++) if(vis[i] != u) { col[u] = i; break; }for(int i = head[u]; ~i; i= nxt[i]){if(col[to[i]]) continue;dfs(to[i]);} }int main() {//freopen("in.txt","r",stdin);int n,m;while(~scanf("%d",&n)){scanf("%d",&m);memset(head+1,-1,sizeof(int)*n);memset(deg+1,0,sizeof(int)*n);memset(col+1,0,sizeof(int)*n);ecnt = 0;while(m--){int u,v;scanf("%d %d",&u,&v);addEdge(u,v); addEdge(v,u);}k = (*max_element(deg+1,deg+1+n))|1;memset(vis+1,0,sizeof(int)*k);dfs(1);printf("%d\n",k);for(int i = 1; i <= n; i++) printf("%d\n",col[i]);putchar('\n');}return 0; }?
轉載于:https://www.cnblogs.com/jerryRey/p/4702323.html
總結
以上是生活随笔為你收集整理的UVA 1613 K-Graph Oddity K度图着色 (构造)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于让bootstrap3兼容ie8
- 下一篇: Karma和Jasmine自动化单元测试