HDU 5723 最小生成樹 樹形dp

2021-07-28 16:02:00 字數 748 閱讀 2696

給出n個點和m條邊,每條邊有乙個權值,題目保證每條邊的權值都不一樣,求出乙個權值最小生成樹,並且求出任意選擇n個點中的兩點之間距離的權值的最小期望。

最小生成樹沒什麼好說的,因為每條邊權值不一樣,所以可以保證求出的最小生成樹一定只有乙個解。按照求出的最小生成樹建一棵樹,所謂期望=任意兩點之間的距離和/c(n,2),這樣只要求出任意選擇兩個點的所有情況的距離和即可,dp一下。

#include using namespace std;

const int maxn = 1e5 + 10;

const int maxm = 1e6 + 10;

struct edge

} e[maxm];

struct node ;

int n, m;

int pa[maxn];

vector tree[maxn];

void init()

}int find(int x)

long long kruskal() );

tree[v].push_back((node));

res += w;}}

return res;

}int sum[maxn];

double expe = 0;

int dfs(int u, int pre)

return sum[u];

}int main()

return 0;

}

hdu 1863 最小生成樹

使用並查集,陣列不要太小 include stdio.h int set 200 int n,m typedef struct nodenode,pnode node road 200 void init int find int u return set u int join int u,int ...

hdu 4081 最小生成樹

先求出最小生成樹,然後列舉樹上的邊,對於每條邊 分別 找出這條割邊形成的兩個塊中點權最大的兩個 1.由於結果是a b,a的變化會引起b的變化,兩個制約,無法直接貪心出最大的a b,故要通過列舉 2.不管magic road要加在 加的邊是否是最小生成樹上的邊,都會產生環,我們都要選擇一條邊刪掉 注意...

hdu 1863(最小生成樹)

基礎的最小生成樹問題,不過 要特判條件不足的情況 include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init int prim if pos 1 return 1 代表這當前步驟缺少條件 int k...