zoukankan      html  css  js  c++  java
  • luoguP1351 联合权值

    题目描述

    无向连通图G 有n 个点,n - 1 条边。点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 。图上两点( u , v ) 的距离定义为u 点到v 点的最短距离。对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu×Wv 的联合权值。

    请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?

    输入输出格式

    输入格式:
    输入文件名为link .in。

    第一行包含1 个整数n 。

    接下来n - 1 行,每行包含 2 个用空格隔开的正整数u 、v ,表示编号为 u 和编号为v 的点之间有边相连。

    最后1 行,包含 n 个正整数,每两个正整数之间用一个空格隔开,其中第 i 个整数表示图G 上编号为i 的点的权值为W i 。

    输出格式:
    输出文件名为link .out 。

    输出共1 行,包含2 个整数,之间用一个空格隔开,依次为图G 上联合权值的最大值

    和所有联合权值之和。由于所有联合权值之和可能很大,输出它时要对10007 取余。

    输入输出样例

    输入样例#1:
    5
    1 2
    2 3
    3 4
    4 5
    1 5 2 3 10

    输出样例#1:
    20 74

    分析:
    旧题重做还是有很多感触的:
    给我们一个启示,在做相同操作时,能合并的尽量合并

    这里写代码片
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define ll long long
    
    using namespace std;
    
    const long long mod=10007;
    const int N=250000;
    struct node{
        int x,y,nxt;
    };
    node way[N];
    int v[N];
    int st[N],tot=0,n;
    ll sum=0,mx=0;
    ll s[N],m1[N],m2[N];
    
    void add(int u,int w)
    {
        tot++;
        way[tot].x=u;way[tot].y=w;way[tot].nxt=st[u];st[u]=tot;
    }
    
    ll max(ll a,ll b)
    {
        if (a>b) return a;
        else return b;
    }
    
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<n;i++)
        {
            int u,w;
            scanf("%d%d",&u,&w);
            add(u,w);
        }
        for (int i=1;i<=n;i++) scanf("%d",&v[i]);
        for (int i=1;i<n;i++)
        {
            int x=way[i].x;
            int y=way[i].y;
            s[x]+=v[y];  //与x相连的所有权值之和
            s[y]+=v[x];
            if (v[y]>m1[x])
            {
                m2[x]=m1[x]; m1[x]=v[y];
            }
            else if (v[y]>m2[x])
            {
                m2[x]=v[y]; 
            }
    
            if (v[x]>m1[y])
            {
                m2[y]=m1[y]; m1[y]=v[x];
            }
            else if (v[x]>m2[y])
            {
                m2[y]=v[x];
            } 
        }
        for (int i=1;i<=n;i++) 
            mx=max(mx,(ll)m1[i]*m2[i]);
        for (int i=1;i<n;i++)
        {
            sum=(sum+(ll)v[way[i].y]*(s[way[i].x]-v[way[i].y])%mod)%mod;
            sum=(sum+(ll)v[way[i].x]*(s[way[i].y]-v[way[i].x])%mod)%mod;
        }
        printf("%lld %lld",mx,sum);
        return 0;
    }
  • 相关阅读:
    营销型站点的建设流程是什么?
    MAC 通过brew安装软件
    Android实现分享内容到微信朋友圈
    C++设计模式之适配器模式(三)
    JEECG平台权限设计
    .Net修改网站项目调试时的虚拟目录(未验证)
    .Net修改网站项目调试时的虚拟目录
    ECharts.js学习动态数据绑定
    百度ECharts
    asp.net loading 动画
  • 原文地址:https://www.cnblogs.com/wutongtong3117/p/7673551.html
Copyright © 2011-2022 走看看