次小生成樹 (附 poj1679)

2022-05-10 03:53:55 字數 1204 閱讀 9045

次小生成樹:

在求最小生成樹時,用陣列path[i][j]來表示mst中i到j最大邊權。

求完後,直接列舉所有不在mst中的邊,把它加入到mst中構成一棵新的樹,且該樹有環,此環是由剛加入的邊(i,j)造成的,所以可以通過刪除path[i][j]即可得到新的一顆樹,且所有的該類樹中必有一棵為次小生成樹。

比如如圖所示:

g,h不是mst上的邊,通過加入邊(g,h),得到乙個環(b,h,g),然後由於在計算最小生成樹時已經計算出g,h之間最大邊權為path[g][h] = bh,所以通過刪除bh即可得到一棵此時最小的生成樹,然後更新答案即可

#include #include 

#include

using

namespace

std;

const

int x = 105

;const

int inf = 100000000

;int

map[x][x],dis[x];

int path[x][x];///

記錄i,j路徑上的最大邊權

int pre[x];///

前驅頂點

int n; ///

頂點數bool use[x],in

[x][x];

intprim()

return

ans;

}int

main()

int ans =prim();

int ok = true

;

for(int i=1;i<=n&&ok;i++) //

列舉找到不在mst上的邊

for(int j=1;j<=n&&ok;j++)

if(map[i][j]!=inf&&!in

[i][j])

if(ans==ans-path[i][j]+map[i][j])

ok = false

;

if(ok)

printf(

"%d\n

",ans);

else

printf(

"not unique!\n");

}return0;

}

POJ 1679 次小生成樹

判斷最小生成樹是否唯一,方法是這樣的 1.對圖中每個點,掃瞄其他的邊,如果存在其他權值相同的邊,則對改邊作標記 2.然後用 kruskal或者prim 求mst 3.求的mst後,如果該mst不包含作了標記的邊,即可判定mst唯一 如果包含作了標記的邊,則依次去掉這些邊在求mst,如果求的mst權值...

poj 1679(次小生成樹)

題意 給你乙個圖,求最小生成樹是否唯一。思路 求次小生成樹,看它和最小生成樹的權值是否相等。include include include include define inf 99999999 using namespace std int vis 10005 int f 105 int n,m ...

POJ 1679 次小生成樹

題目大意,t組樣例輸入,n個點m條邊,求除最小生成樹以外的最短邊。暴力,可勁暴力,資料水,暴力出奇蹟 模擬不選每條最小生成樹中的邊,取最小 by acer.mo include include include include include include includeusing namespac...