Modules(最小树形图)
题目链接:
Modules
蒜头有一块主板,为了提升其性能,可在主板上安置若干增强模块。蒜头有n个不同的增强模块,增强模块可以直接安置在主板上,也可以安置在已经直接或间接连接在主板上的其他增强模块上。
每个增强模块具有一个初始强化值,其中第i个模块的初始强化值为Pi。在所有模块安置完成后,每个模块的最终强化值为其自身初始强化值及直接安置在其上的所有模块的最终强化值之和。
除此之外,有m对模块由于具有良好的契合度,在安置时可以获得额外的强化值加成:将模块Aj直接安置在模块Bj上时,模块Bj的强化值可以获得Qj的额外加成。
主板的最终强化值为直接安置在主板上的所有模块最终强化值之和,请合理安置模块使得主板获得最大的强化值,并输出最大强化值。
输入第一行为一个整数T,表示一共有T组测试数据。
对于每组测试数据:
第一行为两个整数n,m(1≤n≤3000,0≤m≤3000)。
第二行为n个整数Pi(1≤Pi≤109),数之间以单个空格间隔。
接下来m行中,第j行有三个整数Aj,Bj,Qj(1≤Aj,Bj≤n,Aj≠Bj,1≤Qj≤109)。
数据保证同一组(Aj,Bj)只出现一次。
对于每组测试数据:输出一个整数表示主板的最大强化值。
1
3 4
1 2 4
3 1 8
3 2 16
2 1 32
1 2 64
87 题意: 思路:可以发现所有的p最后都会加到答案上,然后那些边要求不能有环,而且出度为1,把边方向就是求最大树形图了,可以建一个虚根,然后向每个点连边,跑朱刘算法就好了,这里的最大树形图一定存在(加了根之后边数会变多,我数组开小了一直wa)
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=3e3+10;
LL ans=0;
const LL inf=1e14;
int n,m,vis[maxn],id[maxn],pre[maxn],cnt=0;
LL in[maxn];
struct Edge
{
int u,v;
LL cost;
}edge[2*maxn];
inline void add_edge(int u,int v,LL w)
{
cnt++;
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].cost=w;
}
inline LL solve()
{
LL ret=0;
int root=0;
for(int i=1;i<=n;i++)add_edge(root,i,0);
n=n+1;
while(true)
{
for(int i=0;i<n;i++)in[i]=-inf;
for(int i=1;i<=cnt;i++)
{
if(edge[i].cost>in[edge[i].v]&&edge[i].u!=edge[i].v)
{
in[edge[i].v]=edge[i].cost;
pre[edge[i].v]=edge[i].u;
}
}
int cntnode=0;
memset(id,-1,sizeof(id));
memset(vis,-1,sizeof(vis));
in[root]=0;
for(int i=0;i<n;i++)
{
ret=ret+in[i];
int v=i;
while(vis[v]!=i&&v!=root&&id[v]==-1)
{
vis[v]=i;
v=pre[v];
}
if(id[v]==-1&&v!=root)
{
for(int u=pre[v];u!=v;u=pre[u])id[u]=cntnode;
id[v]=cntnode++;
}
}
if(cntnode==0)break;
for(int i=0;i<n;i++)
{
if(id[i]==-1)id[i]=cntnode++;
}
for(int i=1;i<=cnt;i++)
{
int v=edge[i].v;
edge[i].u=id[edge[i].u];
edge[i].v=id[edge[i].v];
if(edge[i].u!=edge[i].v)
{
edge[i].cost-=in[v];
}
}
n=cntnode;
root=id[root];
}
return ret;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
cnt=0;ans=0;
int u,v,w,x;
for(int i=1;i<=n;i++)scanf("%d",&x),ans=ans+x;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add_edge(v,u,(LL)w);
}
printf("%lld\n",solve()+ans);
}
return 0;
}
Modules(最小树形图)的更多相关文章
- bzoj4349: 最小树形图
最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...
- hdu 4966 GGS-DDU (最小树形图)
比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是 ...
- HDU 4966 GGS-DDU(最小树形图)
n个技能,每个技能有0-a[i]的等级,m个课程,每个课程需要前置技能c[i]至少达到lv1[i]等级,效果是技能d[i]达到lv2[i]等级,花费w[i]. 输出最小花费使得全技能满级(初始全技能0 ...
- hdu3072 强连通+最小树形图
题意:有一个人他要把一个消息通知到所有人,已知一些通知关系:A 能通知 B,需要花费 v,而又知道,如果某一个小团体,其中的成员相互都能直接或间接通知到,那么他们之间的消息传递是不需要花费的,现在问这 ...
- HDU4966 GGS-DDU(最小树形图)
之前几天想着补些算法的知识,学了一下最小树形图的朱刘算法,不是特别理解,备了份模板以备不时之需,想不到多校冷不丁的出了个最小树形图,没看出来只能表示对算法不太理解吧,用模板写了一下,然后就过了.- - ...
- POJ3164 Command Network(最小树形图)
图论填个小坑.以前就一直在想,无向图有最小生成树,那么有向图是不是也有最小生成树呢,想不到还真的有,叫做最小树形图,网上的介绍有很多,感觉下面这个博客介绍的靠谱点: http://www.cnblog ...
- HDU ACM 2121 Ice_cream’s world II (无根最小树形图)
[解题思路]这题先看了NotOnlySuccess的解题思路,即设置虚根再处理的做法:弄了一个上午,再次有种赶脚的感觉~~如果需要找出为什么需要去比所有权值之和更大的数为新增的虚边的话,一开始我理解仅 ...
- Uva 11183 - Teen Girl Squad (最小树形图)
Problem ITeen Girl Squad Input: Standard Input Output: Standard Output You are part of a group of n ...
- POJ 3164 Command Network (最小树形图)
[题目链接]http://poj.org/problem?id=3164 [解题思路]百度百科:最小树形图 ]里面有详细的解释,而Notonlysucess有精简的模板,下文有对其模板的一点解释,前提 ...
随机推荐
- Python多版本共存管理工具之pyenv
目录 Table of Contents 1. 安装pyenv 2. 安装Python 3.0 使用python 参考 Table of Contents 经常遇到这样的情况: 系统自带的Python ...
- 从零开始玩转JMX(三)——Model MBean
Model MBean 相对于Standard MBean,Model MBean更加灵活.如果我们不能修改已有的Java类,那么使用Model MBean是不错的选择. Model MBean也是一 ...
- windows使用Pandoc将Markdown转换为PDF文件
pandoc下载:https://github.com/jgm/pandoc/releases/tag/1.19.2.1 //windows下载msi文件 miktex下载:https://mikte ...
- Python学习札记(十) Function1 函数调用
参考:调用函数 Note 1.Python内置了很多函数,我们可以直接对这些函数进行调用.Python官网:Built in Fuctions eg.调用abs函数(取绝对值函数): >> ...
- [WCF安全1]使用basicHttpBinding构建UserName授权的WCF应用程序
最近到了新公司,leader让我研究一下WCF的传输安全机制.以前也做过WCF的应用,但是很少涉及安全方面的东西.所以,花了三天的时间研究了一下如何在WCF的应用程序中配置安全.在这个系列文章中,我会 ...
- Memcached get 命令
Memcached get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空. 语法: get 命令的基本语法格式如下: get key 多个 key 使用空 ...
- MySQL MVVC
什么是MVVC? MVVC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Contr ...
- 分享几道Java线程面试题
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...
- 《Think in Java》(十七)容器深入研究
阿西吧,这一章好长啊,感觉看了快一个月了吧!JDK 自带的容器框架真是很好很强大啊,这一章看得有点蒙蒙的,接下来还得去看看官方文档啊!
- zabbix自动化运维学习笔记(服务器安装)
最近博主开始接触自动化运维.首先就是zabbix这个开源的监控系统 一开始博主只是在自己的虚拟机上尝试安装.最后终于开始在公司的服务器上正式安装,教程博主也是通过度娘找的 这是原文:链接 安装环境:C ...