判斷最小生成樹是否唯一,方法是這樣的:
1. 對圖中每個點,掃瞄其他的邊,如果存在其他權值相同的邊,則對改邊作標記
2. 然後用 kruskal或者prim 求mst
3. 求的mst後,如果該mst不包含作了標記的邊,即可判定mst唯一;如果包含作了標記的邊,則依次去掉這些邊在求mst,如果求的mst權值和原mst權值一樣,即可判定mst不唯一。
這裡在在第二次計算生成樹時,不能每次都將邊的used 置為1,只有在第一次可以,因為第一次計算的結果就是最終的結果。而第二次計算的時候是列舉的,會有很多種情況,而used本身的作用就是在第二次生成樹演算法中和 uni 一起判斷使用的,這個只依賴第一次的結果。
#include #include #include #include using namespace std;
#define elen 10000
typedef struct edge edge;
edge e[elen];
int p[elen];
bool first;
bool cmp(edge a, edge b)
void init(int n)
}int find(int x)
int kruskal(int n, int m)
} }if(num != n) return -1;
return sum;
}int main()
sort(e, e+m, cmp);
for(i = 0; i < m; i++)
} int ans = kruskal(n, m);
for(i = 0; i < m; i++)
if(i >= m)
else
e[i].del = 0;}}
if(i >= m)
} }return 0;
}
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...
POJ 1679(次小生成樹)
poj1679 分析 本題可以通過求出次小生成樹,然後再比較次小生成樹與最小生成是否相等來判斷最小生成樹是否唯一。我們仔細回想一下kruskal求最小生成樹的過程,最後得到的一定是乙個無向連通圖,如果我們要想求次小生成樹的話,我們可以考慮列舉每一條不屬於最小生成樹的邊,然後這條邊會和原先的最小生成樹...