【动态规划】【图论】[NOIP模拟赛]独立集
題目描述:
有一天,一個(gè)名叫順旺基的程序員從石頭里誕生了。又有一天,他學(xué)會(huì)了冒泡排序和獨(dú) 立集。在一個(gè)圖里,獨(dú)立集就是一個(gè)點(diǎn)集,滿足任意兩個(gè)點(diǎn)之間沒(méi)有邊。于是他就想把這兩 個(gè)東西結(jié)合在一起。眾所周知,獨(dú)立集是需要一個(gè)圖的。那么順旺基同學(xué)創(chuàng)造了一個(gè)算法, 從冒泡排序中產(chǎn)生一個(gè)無(wú)向圖。
這個(gè)算法不標(biāo)準(zhǔn)的偽代碼如下:
void bubblesortgraph(n,a[])
//輸入:點(diǎn)數(shù)n,1到n的全排列a
//輸出:一個(gè)點(diǎn)數(shù)為n的無(wú)向圖G
{ 創(chuàng)建一個(gè)有n個(gè)點(diǎn),0條邊的無(wú)向圖G。
do{ swapped=false
for i 從1 到n-1
if(a[i]>a[i+1])
{ 在G中連接點(diǎn)a[i]和點(diǎn)a[i+1]
交換a[i]和a[i+1]
swapped =true
}
}while(swapped);
輸出圖G。
}
//結(jié)束。
那么我們要算出這個(gè)無(wú)向圖G最大獨(dú)立集的大小。但是事情不止于此。順旺基同學(xué)有時(shí) 候心情會(huì)不爽,這個(gè)時(shí)候他就會(huì)要求你再回答多一個(gè)問(wèn)題:最大獨(dú)立集可能不是唯一的,但 有些點(diǎn)是一定要選的,問(wèn)哪些點(diǎn)一定會(huì)在最大獨(dú)立集里。今天恰好他不爽,被他問(wèn)到的同學(xué) 就求助于你了。
首先可以發(fā)現(xiàn)一定是在當(dāng)前序列中的最長(zhǎng)上升子序列,但是怎么才能判斷當(dāng)前數(shù)字一定在所有的最長(zhǎng)上升子序列中呢?可以判斷(以當(dāng)前為開(kāi)始的向左邊的最長(zhǎng)下降子序列,以當(dāng)前為開(kāi)始的向右的最長(zhǎng)上升子序列)的二元組是唯一的否則一定有另一個(gè)可以替換,弄兩次最長(zhǎng)上升子序列就行了,具體的優(yōu)化方法自己百度吧
輸入
3
3 1 2
輸出
2
2 3
轉(zhuǎn)載于:https://www.cnblogs.com/JeremyGJY/p/5921659.html
總結(jié)
以上是生活随笔為你收集整理的【动态规划】【图论】[NOIP模拟赛]独立集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在openstack环境中安装racks
- 下一篇: 1022 词法分析程序总结