給出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...