点权生成树(gentree)
点权生成树(gentree)
题目背景
Awson是某国际学校信竞组的一只菜鸡。终于弄明白边权最小生成树后,然而又被大神嘲笑了。大神深邃的眼光中透露了些睿智,说道:“你会求点权最小生成树么?”Awson不屑的说道:“不会。但我有办法。”于是他找到了你,请你帮他解决这个问题。
题目描述
给你一个有向连通图G,每点有个权值Di(0<Di),要求生成一棵树根为1号节点的有根树T。对于树中边E,E的代价为所有从根出发的且包含E的路径的终点权值的和。现求生成树T,使得边的代价总和最小。
输入输出格式
输入格式:
第一行N,M分别为点数,边数。(0<=N <= 20000;0<=M <= 200000)
接下来M行,每行两个数U,V描述边的两个端点,即从U到V有一条有向边。
最后一行N个数,顺次给出每个点的权值。
输出格式:
一个数,最小代价。
输入输出样例
5 4
1 2
1 3
3 4
3 5
1 2 3 4 5
23
说明
样例解释:
如图只有一种生成树的方法,求得代价为23。
数据规模:
所有数据保证不会超过长整型(C++中的int)。
题解:
归纳发现,算出的总代价就是每个节点在生成树中的深度×点权的和。
我们用贪心的思想,每个点的深度都要尽可能小。那么我们只需以1号节点为源点,跑一遍最短路即可。
由最小生成树的思想,我们易知所有求出的最短路径都在一棵生成树上,满足题意。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,ans,a[];
int head[],size=;
struct node
{
int to,next;
}edge[];
void putin(int from,int to)
{
size++;
edge[size].to=to;
edge[size].next=head[from];
head[from]=size;
}
int dist[];
bool vis[];
void spfa(int r)
{
int i,j;
memset(dist,/,sizeof(dist));
queue<int>mem;
while(!mem.empty())mem.pop();
mem.push(r);
vis[r]=;
dist[r]=;
while(!mem.empty())
{
int x=mem.front();mem.pop();
vis[x]=;
for(i=head[x];i!=-;i=edge[i].next)
{
int y=edge[i].to;
if(dist[y]>dist[x]+)
{
dist[y]=dist[x]+;
if(!vis[y])
{
mem.push(y);
vis[y]=;
}
}
}
}
}
int main()
{
int i,j;
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for(i=;i<=m;i++)
{
int from,to;
scanf("%d%d",&from,&to);
putin(from,to);
}
for(i=;i<=n;i++)
scanf("%d",&a[i]);
spfa();
for(i=;i<=n;i++)
ans+=a[i]*dist[i];
printf("%d\n",ans);
return ;
}
点权生成树(gentree)的更多相关文章
- 机器学习之朴素贝叶斯&贝叶斯网络
贝叶斯决决策论 在所有相关概率都理想的情况下,贝叶斯决策论考虑基于这些概率和误判损失来选择最优标记,基本思想如下: (1)已知先验概率和类条件概率密度(似然) (2)利用贝叶斯转化为后验概 ...
- [总结] LCT学习笔记
\(emmm\)学\(lct\)有几天了,大概整理一下这东西的题单吧 (部分参考flashhu的博客) 基础操作 [洛谷P1501Tree II] 题意 给定一棵树,要求支持 链加,删边加边,链乘,询 ...
- AI人工智能专业词汇集
作为最早关注人工智能技术的媒体,机器之心在编译国外技术博客.论文.专家观点等内容上已经积累了超过两年多的经验.期间,从无到有,机器之心的编译团队一直在积累专业词汇.虽然有很多的文章因为专业性我们没能尽 ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- P4234 最小差值生成树 LCT维护边权
\(\color{#0066ff}{ 题目描述 }\) 给定一个标号为从 \(1\) 到 \(n\) 的.有 \(m\) 条边的无向图,求边权最大值与最小值的差值最小的生成树. \(\color{#0 ...
- 51nod——1640 天气晴朗的魔法 有边权限制的最大生成树
好好读题嗷:“所以我们要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大.” 第一条件是生成树的最大边权更小,第二条件是在最大边权的限制下搞一个最大生成树. 至于最大生成树,如 ...
- poj3532求生成树中最大权与最小权只差最小的生成树+hoj1598俩个点之间的最大权与最小权只差最小的路经。
该题是最小生成树问题变通活用,表示自己开始没有想到该算法:先将所有边按权重排序,然后枚举最小边,求最小生成树(一个简单图的最小生成树的最大权是所有生成树中最大权最小的,这个容易理解,所以每次取最小边, ...
- POJ 1861 Network (Kruskal算法+输出的最小生成树里最长的边==最后加入生成树的边权 *【模板】)
Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14021 Accepted: 5484 Specia ...
- P1223 [小数据版]边权差值最小的生成树
这道题和最小生成树kruskal的代码几乎相同,只不过不一定是最小生成树,所以不一定从最短的边开始做生成树:所以将每一条边分别作为起点,然后枚举就行了...... #include <bits/ ...
随机推荐
- CF785CAnton and Permutation(分块 动态逆序对)
Anton likes permutations, especially he likes to permute their elements. Note that a permutation of ...
- 转 对APK进行重签名
1. 生成Android APK包签名证书1). 在doc中切换到jdk的bin目录cd C:\Program Files\Java\jdk1.6.0_18\bin2). 运 ...
- WPF TreeView 后台C#选中指定的Item, 需要遍历
private TreeViewItem FindTreeViewItem(ItemsControl container, object item) { ...
- HTML特殊字符的html、js、css写法汇总 (转)
⇠ 箭头类 符号 UNICODE 符号 UNICODE HTML JS CSS HTML JS CSS ⇠ ⇠ \u21E0 \21E0 ⇢ ⇢ \u21E2 \ ...
- local_irq_save 与 local_irq_restore
如果你要禁止所有的中断该怎么办? 在2.6内核中,可以通过下面两个函数中的其中任何一个关闭当前处理器上的所有中断处理,这两个函数定义在 <asm/system.h>中: void ...
- python3-----反射实例
#/usr/bin/env python # -*- coding:utf-8 -*- import sys,os class WebServer(object): def __init__(self ...
- [转]对 td 使用 overflow:hidden; 无效的几点错误认识
转载:http://www.cftea.com/c/2010/12/UVBUCD0J888L2XPQ.asp 一.是 td 的原因. 其实这关 td 什么事呢?div 也是一样的,看示例: <d ...
- Jmeter JDBC Request 中文乱码问题
在JDBC Request的SQL Query的编辑器输入中文会乱码,导入插入数据库的内容也是乱码,如下图 解决办法:JDBC Connection Configuration的Database UR ...
- linux多线程加解锁
1.动态方式使用互斥量,该类型的互斥量在定义时不进行初始化,需要在使用之前初始化,使用结束销毁 1.1.定义一个锁变量: pthread_mutex_t g_mutex_Msg; 1. ...
- Javascript 获取客户端的运营商 IP 地址 等
客户端获取运营商 会弹出安全隐患问题,需要修改IE activx 选项, 非常麻烦,用我的代码可以轻松获取. <script src="JS/jquery-1.4.1.js" ...