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个用空格隔开的正整数u、v,表示编号为u和编号为v的点之间有边相连。

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

【输出】

输出文件名为link.out。

输出共1行,包含2个整数,之间用一个空格隔开,依次为图G上联合权值的最大值和所有联合权值之和。由于所有联合权值之和可能很大,输出它时要对10007取余。

【输入输出样例】

link.in

link.out

5

1 2

2 3

3 4

4 5

1 5 2 3 10

20 74

【样例说明】

本例输入的图如上所示,距离为2的有序点对有(1,3)、(2,4)、(3,1)、(3,5)、(4,2)、(5,3)。其联合权值分别为2、15、2、20、15、20。其中最大的是20,总和为74。

【数据说明】

对于30%的数据,1<≤100;

对于60%的数据,1<≤2000;

对于100%的数据,1<≤200,000,0<Wi ≤10,000。

【思路】

分析题目:n个点n-1条边的连通图是树。

注意到题目的特殊性:距离为2。可以得知对于每一个结点它的任意两个相连点都可以产生联合权值。枚举需要O(n^3)的时间。

优化:解决max:注意到对于一个结点而言,产生的联合权值最大为子节点中最大两个W的积。

解决sum:suma= w1*w2+…+w1*wn+w2*w1+w2*w3…+w2*wn+…..=sumw^2-w1^2-w2^2…。因此只需要O(n)的时间就能求出suma。

【代码】

#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std; const int maxn = + ; //从1 小心越界
const int MOD = ; int w[maxn];
int maxw=,sumw=,n;
vector<int> G[maxn]; //vector加速BFS void BFS(int s) {
int vis[maxn]; FOR(i,,n+) vis[i]=;
queue<int> q;
q.push(s); vis[s]=;
while(!q.empty()) {
int u=q.front(); q.pop();
int suma=,sumb=;
suma=(suma*suma)%MOD;
int max1=,max2=;
FOR(i,,G[u].size()) {
int v=G[u][i];
suma = (suma+w[G[u][i]]) % MOD;
sumb = (sumb+(w[v]*w[v]%MOD)) % MOD;
if(w[v]>max1) {max2=max1; max1=w[v];} //如是更新 否则会导致漏解
else if(w[v]>max2) max2=w[v]; if(!vis[v]) {
vis[v]=; q.push(v);
}
}
sumw=(sumw+((suma*suma)%MOD-sumb+MOD)%MOD)%MOD; //注意诸多MOD
maxw=max(maxw,max1*max2);
}
} int main() {
ios::sync_with_stdio(false);
cin>>n;
//从1开始标号
FOR(i,,n-) {
int u,v; cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
FOR(i,,n+) cin>>w[i]; BFS(); cout<<maxw<<" "<<sumw;
return ;
}

NOIP2014 联合权值的更多相关文章

  1. [Luogu 1351] NOIP2014 联合权值

    [Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...

  2. 【洛谷P1351】[NOIP2014]联合权值

    联合权值 题目链接 首先,直接两重循环暴力枚举得了70分 然后发现第二重循环可以记忆化一下 记忆一下每个点的子节点的权值和.最大值. 次大值(为了处理该点的父节点权值恰好为最大值) 具体看代码 #in ...

  3. NOIP2014联合权值

    无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离 ...

  4. [NOIP2014]联合权值 题解

    题目大意: 有一棵树,求距离为2的点权的乘积的和以及最大值. 思路: 枚举每一个点,则与其相邻的点互为距离为2的点.该部分的最大值为点权最大的两个点的积,和为点的权值和的平方减去每个点的平方,这样每条 ...

  5. luogu1351 [NOIp2014]联合权值 (dfs)

    有两种情况:一个点到它的父亲的父亲(要算两次).一个点的子节点之间互相到达 #include<bits/stdc++.h> #define pa pair<int,int> # ...

  6. NOIP 2004 联合权值

    洛谷 P1351 联合权值 洛谷传送门 JDOJ 2886: [NOIP2014]联合权值 D1 T2 JDOJ传送门 Description 无向连通图 G有 n个点,n-1条边.点从 1到 n依次 ...

  7. [NOIP2014] 提高组 洛谷P1351 联合权值

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  8. Noip2014 提高组 T2 联合权值 连通图+技巧

    联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...

  9. NOIP2014提高组第二题联合权值

    还是先看题吧: 试题描述  无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...

随机推荐

  1. c++ 异常处理 assert | try

    #include <iostream> #include <cassert> using namespace std; int main() { ; assert(i == ) ...

  2. spring的配置模式与注解模式基础

    “依赖注入”是spring的核心特征,在Web服务器(如Tomcat)加载时,它会根据Spring的配置文件中配置的bean或者是通过注解模式而扫描并装载的bean实例自动注入到Application ...

  3. 项目图片上传存储的目录部分代码思路Calendar类获取年月日

    在项目中将产品图片全部放置在一个文件夹下面的话,如果图片很多的话,加载速度会减慢,可以按照文件夹按年,月,日来分开存放,图片文件名字取系统时间long类型加上5位随机数字码避免重复. Calendar ...

  4. Connect to the mysql dataase from remote server

    Make sure that the firewall is closed!!!!!!!!! shell command should be like is: mysql -u username -p ...

  5. C++: 单例模式和缺陷

    C++: 单例模式和缺陷 实现一个单例模式 1 class Singleton { 2     private: 3         Singleton() { cout << " ...

  6. C++ DLL 模板 .

    C++ DLL 模板 1.使用VS2005创建Win32 DLL项目,选择空项目,然后加入CppDll.h和CppDll.cpp文件. 2.修改CppDll.h和CppDll.cpp文件使之成为需要的 ...

  7. Android ViewPager的每个页面的显示与销毁的时机

    大家在用viewPager的时候要创建一个pagerAdapter对象,用于给viewPager设置页面的. viewPager里面有一个container容器. viewPager的容器缓存3个显示 ...

  8. POJ2506——Tiling

    Tiling Description In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles? Here is a samp ...

  9. 【HDOJ】4355 Party All the Time

    好久没做过三分的题目了. /* 4355 */ #include <iostream> #include <sstream> #include <string> # ...

  10. bzoj3294

    感觉自己就是不怎么擅长计数的问题 设f[k,i,j]表示前k种颜色占据了i行j列的方案 g[k,i,j]表示第k种颜色占据了i行j列的方案,注意要减去并没占据满i行j列的情况 然后转移就很好写了 像这 ...