第一行兩個整數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問題是神馬啊??但此題因為具有一些特別的性質,所以有專門的解法。
¨弦(chord):連線環中不相鄰的兩個點的邊。
¨弦圖(chordalgraph):乙個無向圖稱為弦圖當且僅當圖中任意長度大於3的環都至少有乙個弦。
¨單純點(simplicialvertex):設n(v)表示與點v相鄰的點集。乙個點稱為單純點當 + n(v)的誘導子圖為乙個團。
¨完美消除序列(perfect elimination ordering):這是乙個序列,它滿足v[i]在的誘導子圖中為單純點。
¨弦圖的判定:存在完美消除序列的圖為弦圖。可以用mcs最大勢演算法求出完美消除序列。
¨最大勢演算法 maximum cardinality search
·從n到1的順序依次給點標號(標號為i的點出現在完美消除序列的第i個)。
·設label[i]表示第i個點與多少個已標號的點相鄰,每次選擇label[i]最大的未標號的點進行標號。
¨判斷乙個序列是否為完美消除序列
·設中所有與vi相鄰的點依次為vj1,…, vjk。只需判斷vj1是否與vj2,…, vjk相鄰即可。
¨本題就是用最少的顏色給每個點染色使得相鄰的點染的顏色不同。
¨完美消除序列從後往前依次給每個點染上可以染的最小的顏色。
3.擴充套件
弦圖的方法有著很多經典用途:例如用最少的顏色給每個點染色使得相鄰的點染的顏色不同,通過完美消除序列從後往前依次給每個點染色,給每個點染上可以染的最小的顏色;最大獨立集問題,選擇最多的點使得任意兩個點不相鄰,通過完美消除序列從前往後能選就選。
我們再引入區間圖的思想,會驚奇地發現它也是弦圖。給定一些區間,定義乙個相交圖為每個頂點表示乙個區間,兩個點有邊當且僅當兩個區間的交集非空,如下圖所示的區間圖:
很顯然區間圖一定是弦圖。這是因為如果存在乙個長度大於3的無弦環,剛ii與ii+1相交的部分pi一定嚴格遞增或嚴格遞減,以遞增為例,即p1
< pn。但由於第乙個i1與最後乙個in相交剛得出pn <
p1產生矛盾。所以區間圖一定是弦圖。給定n個區間,要求選擇最多的區間使得區間不互相重疊,這個問題就是區間圖的最大獨立集問題。
完美消除序列從後往前依次給每個點染上可以染的最小的顏色(為什麼??????)
1 #include2 #include3 #include4 #include5#define node 10010
6#define edg 2000010
7using
namespace
std;89
int n,m,ans=0,head[node],next[edg],to[edg],edgs=0;10
int hash[node],color[node]=,label[node]=,v[node]=,a[node]=;
1112
void add(int a,int
b)15
16int
main()
1727
28 label[0]=-1;29
for(int i=n;i>=1;--i)
3039
40for(int i=n;i>=1;--i)
4149
50for(int i=1;i<=n;++i)
51if(color[i]>ans) ans=color[i];
5253 cout
54//
system("pause");
55return0;
5657 }
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 神奇的國度
傳送門 好像是一道非常神仙的題 本題中具體的概念可以參見cdq大神的 弦圖與區間圖 我們直接來說吧。從這道題中的描述可以看出,由所有人向其認識的人連一條邊,構成的是一張標準的弦圖。而題目要求我們求出這張弦圖的最小染色數。有乙個非常重要的定理 對於一張弦圖,團數 色數 這個證明很難懂不過可以自己領會 ...
HNOI2008 神奇的國度
bzoj1006 這個題就是經典的最小點染色問題的模型。對於弦圖 題目中保證只有三角形,一定是弦圖 可以按其完美序列 乙個點的排列,使得每個點都是字尾的單純點 鄰居節點構成完全圖的點 逆序依次染色,即可求得最小染色。求完美序列可以用最大勢能法 mcs 演算法的過程為每次找出乙個勢能最大的點,放到當前...