bzoj1006
這個題就是經典的最小點染色問題的模型。
對於弦圖(題目中保證只有三角形,一定是弦圖),可以按其完美序列(乙個點的排列,使得每個點都是字尾的單純點(鄰居節點構成完全圖的點))逆序依次染色,即可求得最小染色。
求完美序列可以用最大勢能法(mcs),演算法的過程為每次找出乙個勢能最大的點,放到當前序列的開頭,並將不在序列中的該節點的鄰居節點的勢能增加,即可求出完美序列。正確性沒有找到證明。使用鍊錶(桶)可以做到\(o(n+m)\)的複雜度。
由於求完美序列的順序和染色順序一致(逆序),所以可以同時進行這兩個步驟。
#include #include #include const int n = 10000 + 10;
const int m = 2000000 + 10;
int hd[n], to[m], nxt[m], cnt;
int col[n], flag[n], label[n], vis[n];
int lhd[n], lst[m], tot, w[m];
int ans, n, m;
inline void adde(int x, int y)
inline void push(int x)
inline void mcs()
} flag[w[cur]] = 1;
memset(vis, 0, sizeof vis);
for (int j = hd[w[cur]]; j; j = nxt[j]) else
} for (int j = 1; j <= n; ++j) if (!vis[j])
} printf("%d\n", ans);
}int main()
mcs();
return 0;
}
開始刷八中的這兩天,突然覺得自己會的演算法太少了,有些演算法即使會也難以應用,還是要努力學習,多刷題,理解更多的演算法和模型,爭取早日擺脫蒟蒻的行列。 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 神奇的國度
第一行兩個整數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問題是神馬啊?...