次小生成樹:
在求最小生成樹時,用陣列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...