codeforces 500D - New Year Santa Network (樹形DP+組合數學)

來源:互聯網
上載者:User

標籤:acm   c語言   演算法   編程   樹形dp   

題目地址:http://codeforces.com/contest/500/problem/D

這題是要先求出每條邊出現的次數,然後除以總次數,這樣期望就求出來了。先用樹形DP求出每個邊左右兩端總共有多少個點,然後用組合數學公式就可以推出來了。

代碼如下:

#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>using namespace std;#define LL __int64int vis[110000];int head[110000], cnt, n;LL fx[110000], fy[110000], dp[110000], w[110000];struct node {        int u, v, w, id, next;}edge[210000];void add(int u, int v, LL w, int id){        edge[cnt].v=v;        edge[cnt].w=w;        edge[cnt].id=id;        edge[cnt].next=head[u];        head[u]=cnt++;}void dfs(int u){        dp[u]=1;        vis[u]=1;        for(int i=head[u]; i!=-1; i=edge[i].next) {                int v=edge[i].v;                if(vis[v]) continue ;                dfs(v);                //printf("---%.2f\n",ans);                fx[edge[i].id]=dp[v];                fy[edge[i].id]=n-dp[v];                dp[u]+=dp[v];        }}void init(){        memset(head,-1,sizeof(head));        cnt=0;        memset(vis,0,sizeof(vis));}int main(){        int i, j, u, v, m, k, t;        scanf("%d",&n);        init();        for(i=0; i<n-1; i++) {                scanf("%d%d%I64d",&u,&v,&w[i]);                add(u,v,w[i],i);                add(v,u,w[i],i);        }        dfs(1);        double ans=0;        for(i=0;i<n;i++){                ans+=fx[i]*(fx[i]-1)*fy[i]*w[i]+fx[i]*(fy[i]-1)*fy[i]*w[i];        }        scanf("%d",&m);        while(m--) {                scanf("%d%d",&k,&t);                k--;                //printf("--%.3f\n",ans);                ans-=fx[k]*(fx[k]-1)*fy[k]*(w[k]-t)+fx[k]*fy[k]*(fy[k]-1)*(w[k]-t);                //printf("---%.3f\n",ans);                w[k]=t;                printf("%.9f\n",ans/n/(n-1)/(n-2)*6);        }        return 0;}


codeforces 500D - New Year Santa Network (樹形DP+組合數學)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.