zoukankan      html  css  js  c++  java
  • Dfs【P2052】 [NOI2011]道路修建

    Description

    在 W 星球上有 n 个国家。为了各自国家的经济发展,他们决定在各个国家
    之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝啬,他们只愿
    意修建恰好 n – 1条双向道路。 每条道路的修建都要付出一定的费用, 这个费用等于道路长度乘以道路两端的国家个数之差的绝对值。例如,在下图中,虚线所示道路两端分别有 2 个、4个国家,如果该道路长度为 1,则费用为1×|2 – 4|=2。图中圆圈里的数字表示国家的编号。

    img
    由于国家的数量十分庞大,道路的建造方案有很多种,同时每种方案的修建
    费用难以用人工计算,国王们决定找人设计一个软件,对于给定的建造方案,计
    算出所需要的费用。请你帮助国王们设计一个这样的软件。

    Input

    输入的第一行包含一个整数n,表示 W 星球上的国家的数量,国家从 1到n
    编号。接下来 n – 1行描述道路建设情况,其中第 i 行包含三个整数ai、bi和ci,表
    示第i 条双向道路修建在 ai与bi两个国家之间,长度为ci。

    Output

    输出一个整数,表示修建所有道路所需要的总费用。

    水题.......(老年退役选手只能做水题压压惊。)

    假设当前边的两部分的点的数量分别为(x,y),则当我们遍历的时候

    (y=size[v],x=n-size[v]) ((v)为当前遍历到的儿子节点)

    那么我们得到的就是(|n-2 imes size[v]| imes w[i])((w[i])为当前边的边权)

    注意边权要开 (long long)

    代码

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #define R register
    #define lo long long
    
    using namespace std;
    
    const int gz=1e6+8;
    
    inline void in(R int &x)
    {
    	R int f=1;x=0;char s=getchar();
    	while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
    	while(isdigit(s)){x=x*10+s-'0';s=getchar();}
    	x*=f;
    }
    
    int head[gz],tot,size[gz],n;
    
    lo ans;
    
    struct cod{int u,v;lo w;}edge[gz<<1];
    
    inline void add(R int x,R int y,R lo z)
    {
    	edge[++tot].u=head[x];
    	edge[tot].v=y;
    	edge[tot].w=z;
    	head[x]=tot;
    }
    
    void dfs(R int u,R int fa)
    {
    	size[u]=1;
    	for(R int i=head[u];i;i=edge[i].u)
    	{
    		if(edge[i].v==fa)continue;
    		dfs(edge[i].v,u);
    		size[u]+=size[edge[i].v];
    		ans+=(lo)(abs(n-2*size[edge[i].v])*edge[i].w);
    	}
    }
    
    int main()
    {
    	in(n);
    	for(R int i=1,x,y;i<n;i++)
    	{
    		lo z;
    		in(x),in(y),scanf("%lld",&z);
    		add(x,y,z),add(y,x,z);
    	}
    	dfs(1,0);
    	printf("%lld
    ",ans);
    }
    
  • 相关阅读:
    springmvc
    POJ 3683 Priest John's Busiest Day
    POJ 3678 Katu Puzzle
    HDU 1815 Building roads
    CDOJ UESTC 1220 The Battle of Guandu
    HDU 3715 Go Deeper
    HDU 3622 Bomb Game
    POJ 3207 Ikki's Story IV
    POJ 3648 Wedding
    HDU 1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/-guz/p/10012946.html
Copyright © 2011-2022 走看看