1371. Cargo Agency

2148 단어 Go
http://acm.timus.ru/problem.aspx?space=1&num=1371
트 리 DP  근 데 DFS 한 번 이면 돼 요.
주의해 야 할 것 은 N = 50000 시 롱 롱 롱 을 사용 해 야 합 니 다.  혹은 unsigned int
그리고 스 택 을 초과 하면 자신 이 비교적 큰 스 택 구역 이 필요 합 니 다.
코드:
#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<vector>

#include<queue>

#include<map>

#include<stack>

#include<algorithm>



using namespace std;

#pragma comment(linker,"/STACK:1000000000,1000000000")



#define LL long long



const int INF=0x3f3f3f3f;

const int N=50005;

struct node

{

    int next;

    LL numnode;

    LL selft;

    LL ans;

}head[N];

int I;

struct tt

{

    int j,next,t;

}side[N*2];

void build(int i,int j,int t)

{

    side[I].j=j;

    side[I].t=t;

    side[I].next=head[i].next;

    head[i].next=I++;

}

void dfs(int x,int pre)

{

    head[x].selft=0;

    head[x].numnode=0;

    head[x].ans=0;

    for(int t=head[x].next;t!=-1;t=side[t].next)

    {

        int l=side[t].j;

        if(l!=pre)

        {

            dfs(l,x);

            LL w=head[l].numnode*(LL)(side[t].t)+head[l].selft;

            head[x].ans+=head[l].ans;

            head[x].ans+=(head[x].numnode*w);

            head[x].ans+=(head[x].selft*head[l].numnode);

            head[x].selft+=w;

            head[x].numnode+=head[l].numnode;

        }

    }

    ++head[x].numnode;

    head[x].ans+=head[x].selft;

}

int main()

{

    //freopen("data.txt","r",stdin);

    unsigned int n;

    while(cin>>n)

    {

        for(unsigned int i=1;i<=n;++i)

        head[i].next=-1;

        I=0;

        for(unsigned int i=1;i<n;++i)

        {

            int l,r,t;

            scanf("%d %d %d",&l,&r,&t);

            build(l,r,t);

            build(r,l,t);

        }

        dfs(1,-1);

        double temp=(n*(n-1)/2);

        printf("%.4lf
",double(head[1].ans)/temp); } return 0; }

 

좋은 웹페이지 즐겨찾기