題目大意:Bessie為了破壞FJ的計劃,要搞出一個最大產生樹。
分析:就是把最小產生樹演算法的一個符號改一下就行了。另外,要判斷圖是否聯通
代碼
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 20010;struct Edge{ int s, e, w; bool operator < (const Edge & e1) const { return w > e1.w; }}e[maxn];int f[1010], n, m;int ans;int getfather(int x) { if(f[x] == x) return x; else return f[x] = getfather(f[x]);}int kruscal() { sort(e+1, e+m+1); int cnt = n; for(int i = 1; i <= n; i++) f[i] = i; for(int i = 1; i <= m; i++) { int f1 = getfather(e[i].s); int f2 = getfather(e[i].e); if(f1 != f2) { f[f1] = f2; ans += e[i].w; cnt--; } } if(cnt == 1) return true; //cnt代表;聯通塊的個數 else return false;}int main() { while(~scanf("%d%d", &n, &m)) { for(int i = 1; i <= m; i++) scanf("%d%d%d", &e[i].s, &e[i].e, &e[i].w); if(kruscal()) printf("%d\n", ans); else printf("-1\n"); } return 0;}