NOIP2014联合权值
无向连通图G有n个点,n-1条边。点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1。图上两点(u, v)的距离定义为u点到v点的最短距离。对于图G上的点对(u, v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值。
请问图G上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?
题目链接:codevs http://www.cnblogs.com/smileandyxu/p/5348411.html
图论问题,70分暴力都很好打吧,只要枚举所有点dfs找到他的距离为二的点,维护一个tot和一个max就可以了,细节自己想想,代码
等下会贴出来,正解是乘法的结合律,这个题目可以转换一下,对于每个点对,可以看成由一点中间点中转而成,就是每个点对中必定有
且只隔一个点吧,因为图是棵树,只要枚举每个入度为1的点作为中转点,然后将其儿子与其他所有儿子相乘就可以了,但这是n平方的啊!会超时。
所以我们用乘法原理,统计所有儿子权值和,然后用权值和剪去自己的权值的值再乘自己的权值,这样就是O(n)完成了。
另外,推荐我的博客:http://www.cnblogs.com/renjianshige/
暴力代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<cstring>
const int MAXN=;
using namespace std;
struct edge{
int first;
int next;
int to;
int quan;
}a[*MAXN];
bool b[MAXN];
struct node{
int now;
int fa;
node(){}
node(int _now,int _fa):now(_now),fa(_fa){}
};
int dian[MAXN];
int in[MAXN];
int n,num=;
void addedge(int from,int to){
a[++num].to=to;
a[num].quan=;
a[num].next=a[from].first;
a[from].first=num;
}
long long tott=,big=;
void dfs(int now,int fa,int time){
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
if(to==fa) continue;
if(time==){
if(b[to]) continue;
long long dianquan=dian[fa]*dian[to];
big=max(big,dianquan);
tott=(tott+dianquan)%;
continue;
}
dfs(to,now,time+);
}
}
int main(){
memset(dian,,sizeof(dian));
memset(b,,sizeof(b));
scanf("%d",&n);
for(int i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
for(int i=;i<=n;i++){
scanf("%d",&dian[i]);
}
for(int i=;i<=n;i++){
dfs(i,,);
b[i]=;
}
printf("%lld %lld\n",big,(tott*)%);
return ;
}
AC代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<cstring>
const int MAXN=;
using namespace std;
struct edge{
int first;
int next;
int to;
int quan;
}a[*MAXN];
bool b[MAXN];
int dian[MAXN];
int in[MAXN];
int n,num=;
void addedge(int from,int to){
a[++num].to=to;
a[num].quan=;
a[num].next=a[from].first;
a[from].first=num;
}
long long tott=,big=;
void dfs(int now){
long long tot=,big1=,big2=;
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
tot=(tot+dian[to])%;
if(dian[to]>big1)
{
big1=dian[to];
continue;
}
if(dian[to]<=big1&&dian[to]>big2) big2=dian[to];
}
for(int i=a[now].first;i;i=a[i].next){
tott+=dian[a[i].to]*(tot-dian[a[i].to])%;
if(tott<) tott+=;
tott=tott%;
}
if(big<big1*big2) big=big1*big2;
}
int main(){
memset(dian,,sizeof(dian));
memset(b,,sizeof(b));
scanf("%d",&n);
for(int i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
in[x]++;
in[y]++;
}
for(int i=;i<=n;i++){
scanf("%d",&dian[i]);
}
for(int i=;i<=n;i++){
if(in[i]==) continue;
dfs(i);
}
printf("%lld %lld\n",big,tott%);
return ;
}
NOIP2014联合权值的更多相关文章
- [Luogu 1351] NOIP2014 联合权值
[Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...
- NOIP2014 联合权值
2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每条边的长度均为1.图上两点(u, v)的距离定义为u ...
- 【洛谷P1351】[NOIP2014]联合权值
联合权值 题目链接 首先,直接两重循环暴力枚举得了70分 然后发现第二重循环可以记忆化一下 记忆一下每个点的子节点的权值和.最大值. 次大值(为了处理该点的父节点权值恰好为最大值) 具体看代码 #in ...
- [NOIP2014]联合权值 题解
题目大意: 有一棵树,求距离为2的点权的乘积的和以及最大值. 思路: 枚举每一个点,则与其相邻的点互为距离为2的点.该部分的最大值为点权最大的两个点的积,和为点的权值和的平方减去每个点的平方,这样每条 ...
- luogu1351 [NOIp2014]联合权值 (dfs)
有两种情况:一个点到它的父亲的父亲(要算两次).一个点的子节点之间互相到达 #include<bits/stdc++.h> #define pa pair<int,int> # ...
- NOIP 2004 联合权值
洛谷 P1351 联合权值 洛谷传送门 JDOJ 2886: [NOIP2014]联合权值 D1 T2 JDOJ传送门 Description 无向连通图 G有 n个点,n-1条边.点从 1到 n依次 ...
- [NOIP2014] 提高组 洛谷P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- Noip2014 提高组 T2 联合权值 连通图+技巧
联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...
- NOIP2014提高组第二题联合权值
还是先看题吧: 试题描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...
随机推荐
- 【3】Decision tree(决策树)
前言 Decision tree is one of the most popular classification tools 它用一个训练数据集学到一个映射,该映射以未知类别的新实例作为输入,输出 ...
- python中列表,数字,字符串函数总结
列表list: arr = [] 1.可以定义空列表 2.可以定义只有一个元素的列表 3.元素可以是任意类型 arr.append('abc')末尾添加 arr.insert(index,objec) ...
- React Hooks 你不来了解下?
前言 最近在看 React 的新语法-- React Hooks,只能一句话概括:React 语法真的是越来越强大,越写代码越少. 强烈推荐还没看 React Hooks 的同学去学习下,这会让你写r ...
- Redis常用命令(key、string、List)
1.Key 1.keys * 查询所有数据 2.exists key名 判断key名是否存在 3.move key名 数据库号(0-15) 移动数据key名到相应的数据库 4.expire ...
- C#加载前生成静态网页
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...
- 企业及监控zabbix
Php要求必须是5.4及以上(centos 7默认是 5.4.16可以) #安装依赖库 yum -y install gcc curl curl-devel net-snmp net-snmp-dev ...
- 02 (H5*) Vue第二天
目录: 1:全局过滤器的使用 2:局部过滤器 3:自定义键盘码 4:自定义指令 5:自定义私有指令 6:Vue生命周期. 7:网络请求 1:全局过滤器的使用 Vue.filter("msgF ...
- 【原创】如何根据日志来估算线上QPS
引言 大家好,我是渣渣烟. 我又来水文章了.这篇文章我个人感觉含金量不是太大,大概5分钟左右就能看完!其实大家都知道,我不爱写这种操作型的文章,一顿截图写几个命令就搞定了,含金量不高. 然而,近期有一 ...
- .Net WCF服务部署IIS详细解析
官方解析:Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台.整合了原有的windows通 ...
- 设计模式笔记(一):Singleton 设计模式
今天开始学习设计模式,借此机会学习并整理学习笔记. 设计模式是一门不区分语言的课程,什么样的编程语言都可以用到设计模式.如果说java语法规则比作武功招式的话,那么设计模式就是心法. 设计模式共有23 ...