HNOI2008 神奇的國度

2022-05-05 18:45:06 字數 1137 閱讀 4747

傳送門

好像是一道非常神仙的題……

本題中具體的概念可以參見cdq大神的**:弦圖與區間圖

我們直接來說吧。 從這道題中的描述可以看出,由所有人向其認識的人連一條邊,構成的是一張標準的弦圖。而題目要求我們求出這張弦圖的最小染色數。

有乙個非常重要的定理:對於一張弦圖,團數 = 色數(這個證明很難懂不過可以自己領會)

所以我們可以直接求最大團數。先用最大勢演算法求出弦圖的完美消除序列,之後從後往前,將每個點所能連通的點用最小的色去染色(就是編號最小的),這樣就能直接求出來最少染色數了。

**看著非常的簡單……

#include#include

#include

#include

#define rep(i,a,n) for(int i = a;i <= n;i++)

#define per(i,n,a) for(int i = n;i >= a;i--)

#define enter putchar('\n')

using

namespace

std;

typedef

long

long

ll;const

int m = 1000005

;const

int n = 10005

;int

read()

while(ch >= '

0' && ch <= '9'

)

return ans *op;

}

struct

node

e[m<<1

];int

n,m,len,ans,label[n],col[n],ecnt,head[n],x,y,q[n],check[n];

bool

vis[n];

void add(int x,int

y)void mcs()//

這裡的最大勢演算法沒有優化……不過直接n^2跑一遍也可以

}void

color()

col[now] =d;

ans = max(ans,d);//

新使用一種顏色並更新答案}}

intmain()

HNOI2008 神奇的國度

最大團數 最小色數 最大獨立集 最小團覆蓋 第一行兩個整數n,m。1 n 10000,1 m 1000000.表示有n個人,m對認識關係.接下來m行每行輸入一對朋 友輸出乙個整數,最少可以分多少隊 4 51 2 1 42 4 2 33 4 3一種方案 1,3 2 4 網上一搜才找到是最大勢演算法 完...

HNOI2008 神奇的國度

bzoj1006 這個題就是經典的最小點染色問題的模型。對於弦圖 題目中保證只有三角形,一定是弦圖 可以按其完美序列 乙個點的排列,使得每個點都是字尾的單純點 鄰居節點構成完全圖的點 逆序依次染色,即可求得最小染色。求完美序列可以用最大勢能法 mcs 演算法的過程為每次找出乙個勢能最大的點,放到當前...

HNOI2008 神奇的國度

第一行兩個整數n,m。1 n 10000,1 m 1000000.表示有n個人,m對認識關係.接下來m行每行輸入一對朋友 輸出乙個整數,最少可以分多少隊 4 51 2 1 42 4 2 33 4 3一種方案 1,3 2 4 這道題,嘿嘿.clj大神說染色問題貌似是np完全問題,話說np問題是神馬啊?...