傳送門
好像是一道非常神仙的題……
本題中具體的概念可以參見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問題是神馬啊?...