官方題解在這
首先注意到任意兩條邊的邊權是不一樣的,由此得知最小生成樹是唯一的,最小生成樹既然 是唯一的,那麼期望其實也就是唯一的,不存在什麼最小期望。求完最小生成樹之後,接下 來的問題就可以轉換成在最小生成樹上求任意兩點之間距離的平均值,對於每條邊,統計所 有的路徑用到此邊的次數,也就是邊的兩端的點數之積。那麼這條邊的總貢獻就是次數邊 權。最後得到所有邊的貢獻之和再除以總路徑數n∗(n−1)/2n(n-1)/2n∗(n−1)/2就是答案。可以ononon求出。任取一點為根dfs,對每個點iii記錄其子樹包含的點數(包括其自身),設點數為sum[i]sum[i]sum[i],則iii的父親一側的點數即為n−sum[i]n-sum[i]n−sum[i]。一邊遍歷一邊統計就行。懶,longlong是個巨坑點,,,比賽時交了27次還沒過(好菜啊)
今天改個i64d就過了,,,心累
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
const
int m=1000007;
const
int n=100007;
int m;
ll n;
struct edge
edge(int a,int b,ll c)
bool
operator
< (const edge e)const
int f[n];
int f(int x)
int a[n];
bool vis[n];
ll sum;
void dfs(int x)
}int main()
for (int i=1;i<=n;i++)g[i].clear();
sort(edges+1,edges+m+1); //kruskal
for (int i=1;i<=n;i++)f[i]=i;
int cnt=0;
ll sum=0;
for (int i=1;i<=m;i++)
sum = 0;
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
dfs(1);
double ans=2.0*sum/(n*(n-1));
printf("%i64d %.2lf\n",sum,ans);
}return
0;}
hdu5289多校第一場第二題
題目大意 給你一串數字,問有幾個連續的序其最大值與最小值之差不大於k。借用雙指標的思想,i,j初始化都為0,然後j往後移動,遇到第乙個使區間不符合條件的位置停下,ans加上此時的區間數目,因為是連續的且以i為起點,所以區間只有j i個 然後i往後移動,每移動乙個位置,加乙個j i,直到與j那個位置有...
hdu1520樹形dp第一題
判斷最大的歡喜值,如果上司來了,直系下屬就不來 如果子節點j不來那麼dp i 1 dp j 0 如果子節點j來那麼dp i 0 max dp j 0 dp j 1 因為j不來i也可以不來 遞迴的求子節點值 include include include include include include...
2017多校第二場最後一題
給n個點,問在座標系上能組成多少個正多邊形。因為n是整數,所以只能是組成正方形,所以題目就變成了求圖中的n個點能夠組成多少個正方形。列舉兩個頂點,判斷剩下的兩個點是否存在。第乙個計算幾何題,就是暴力 從來沒寫過數學題,比賽的時候 隊友沒看的n是整數也一直寫不出。一下午真是。好菜啊 include i...