NOIP模擬 MST 類次小生成樹

2022-06-01 07:15:09 字數 786 閱讀 8555

給一張無向圖,可以將圖中權值為v的邊修改為k-v,求修改後的最小生成樹邊權和。

最小生成樹的環切定理:任何非樹邊一定比對應樹鏈上的所有邊權值要大。否則我們可以將鏈上最大的樹邊刪去而連線這一條邊。

運用這個性質,先求出原圖的最小生成樹,然後再來列舉邊,如果列舉到一條邊:

#includeusing namespace std;

const int n = 1050, m = 1e6 + 50, oo = 0x3f3f3f3f;

int n;

int m, k, ans1, ans2;

struct node

}edge[m];

struct node2

inline void init()

inline int getanc(int x)

inline void addedge(int u, int v, int t)

inline int kruskals()

} return ret;

} inline void dfs(int now, int u, int f, int mx)

}}mst;

namespace io

inline void wr(int x)

}using namespace io;

int main()

printf("%d", ans2);

return 0;

}

最小生成樹(MST)

在帶權圖中,所有的生成樹中邊權的和最小的那棵 或幾棵 被稱為最小生成樹。幾點注意 求最小生成樹使用kruskal演算法。使用並查集處理節點的集合屬性,初始時所有結點屬於只包含其自身的孤立集合。實現 include include using namespace std define n 101 in...

最小生成樹 MST

1 prim演算法 對點進行貪心操作。適合稠密圖 const int m 1005 int vis m 表示該i點是否被選擇 vis i 0 還未被選擇 int map m m map i j 表示i到j的距離 int dis m 1到i的距離和 void prim cout sum 2 krusk...

最小生成樹MST

最小生成樹是在一張無向連通圖中,找到一棵樹,使得其邊的代價之和最小。注 可能存在多個最小生成樹。以邊為展開,將圖中的最小代價邊嘗試加入集合tree中,並且該邊不能與集合tree中的邊形成環,如此迭代,最終得到的集合tree為mst。因此可以採用並集查的方式實現kruskal演算法 以點為展開,將圖中...