codevs3728 联合权值

题目描述 Description

输入描述 Input Description

输出描述 Output Description

样例输入 Sample Input

样例输出 Sample Output

数据范围及提示 Data Size & Hint

思路:
1、以每一个点为轴,左右两个点算权值

2、注意加法结合律(a+b+c)2 = a2 + b2 + c2 + 2ab + 2ac + 2bc

3、取模问题,(a+b)%c ≠ (a%c + b%c)%c,(a + b) % c = (a + b%c)%c

代码:

(注意链式前向星的使用)

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn =400020;
struct edge{
    int next;
    int to;
    int power;
};
edge test[maxn];
int head[maxn],cur = 0,n,j[maxn],p[maxn],max1[maxn],max2[maxn],nmax1[maxn],coun[maxn];
long long int vall = 0,vmax = 0,sub =0;

int use(int i)
 {
     int t=head[i];
     int ti,tmp,sum=0,cha2=0;

     while (t!=-1)
     {    ti=test[t].to;
          sum=(sum+p[ti]%10007)%10007;
          cha2+=p[ti]*p[ti]%10007;
          if (p[ti]>max1[i] )
           { max1[i]=p[ti];
             nmax1[i]=ti;
           }
           t=test[t].next;
           coun[i]++;

     }
    sum=(sum*sum%10007 +10007-cha2%10007)%10007;
    vall+=sum%10007;
    return sum;
 } 

/*int dfs(int deep,int last,int now){
    if(deep == 2){
        if(last == now) return 0;
        int temp;
        temp =  p[now]* p[last];
        if(temp > vmax) vmax = temp;
        return 0;
    }

    for(int k=head[now];k>-1;k=test[k].next){
        dfs(deep + 1,last,test[k].to);
    }
} */
void dfs(int i)
 {  int ansi=1;
    if (coun[i]>1)
     {
        int t=head[i];
        int ti;
        while (t!=-1)
         {
          ti=test[t].to;
           if (ti!=nmax1[i] )
             {
             if  (p[ti]>max2[i] )
              max2[i]=p[ti];}
          t=test[t].next;
          }
     }
     if (vmax<max1[i]*max2[i] ) vmax=max1[i]*max2[i];

 }

void add(int u,int v,int w){
    test[cur].power = w;
    test[cur].to = v;
    test[cur].next = head[u];
    head[u] = cur++;
}
int main(){
    cin>>n;
    int u,v,w;
    for(int i = 0;i < n;i++){
         test[i].power = 1;
         test[i].next = -1;
         head[i] = -1;
         j[i] = 1;
    }
    int tu,tv;
    for(int i = 0;i < n-1;i++){
        cin>>tu>>tv;
        tu--;
        tv--;
        add(tu,tv,1);
        add(tv,tu,1);

    }
    for(int i = 0;i < n;i++) cin>>p[i];

    for(int i = 0;i < n;i++)use(i);
    for(int i = 0;i < n;i++)dfs(i);
    cout<<vmax<<" "<<vall % 10007<<endl;
    return 0;
}
时间: 2024-11-13 02:18:30

codevs3728 联合权值的相关文章

洛谷【P1351】codevs3728 联合权值

题目描述 无向连通图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 行,每

codevs3728联合权值(LCA)

3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 输入描述 Input Description 输出描述 Output Description 样例输入 Sample Input 样例输出 Sample Output 数据范围及提示 Data Size & Hint /* 自己打暴力,看了看不用打LCA只处理倍增数组 然后就10分了...... 神奇的LCA 估计打了能有60分 只能看峰峰.

[NOIP2014]联合权值

描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值. 请问图G上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入格式 输入文件名为link.in. 第一行包含1个整数n. 接下来n-1行,每行包含2个用空格隔开的正整数u.v,表示编号为u和编号为v的点之间有边相连.

洛谷 P1351 联合权值(NOIp2014D1T2)

题目描述 无向连通图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 行,每

洛谷——P1351 联合权值

https://www.luogu.org/problem/show?pid=1351 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离.对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu×Wv 的联合权值. 请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入输出格式 输入格式

【NOIP之旅】NOIP2014 day1 T2 联合权值

2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值. 请问图G上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? [输入] 输入文件名为link.in. 第一行包含1个整数n. 接下来n-1行,每行包含2个用空格隔开

洛谷1351 联合权值

题目描述 无向连通图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

NOIP 2014 D1T2 -联合权值

联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值. 请问图G上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? [输入] 输入文件名为link.in. 第一行包含1个整数n. 接下来n-1行,每行包含2个用空格隔开的正

P1351 联合权值

P1351 联合权值 题目描述 无向连通图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 . 接