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有精简的模板,下文有对其模板的一点解释,前提 ...
随机推荐
- 20145231熊梓宏 《网络对抗》 实验9 Web安全基础实践
20145231熊梓宏 <网络对抗> 实验9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? •SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面 ...
- Hive压缩格式
TextFile Hive数据表的默认格式,存储方式:行存储. 可使用Gzip,Bzip2等压缩算法压缩,压缩后的文件不支持split 但在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此 ...
- 【前端】jQuery选择器$()的实现原理
今天三七互娱技术面试的时候面试官问了我这个问题,当时一脸懵逼,于是好好总结一下. 当我们使用jquery选择器的时候,$(s).回默认去执行jquery内部封装好的一个init的构造函数每次申明一个j ...
- 通过Fiddler进行手机抓包
通过Fiddler进行手机抓包 通过Fiddler抓包工具,可以抓取手机的网络通信,但前提是手机和电脑处于同一局域网内(WI-FI或热点),然后进行以下设置: 用Fiddler对Android应用进行 ...
- LeetCode——Coin Change
Question You are given coins of different denominations and a total amount of money amount. Write a ...
- [源码解读] ResNet源码解读(pytorch)
自己看读完pytorch封装的源码后,自己又重新写了一边(模仿其书写格式), 一些问题在代码中说明. import torch import torchvision import argparse i ...
- RMQ问题 - ST表的简单应用
2017-08-26 22:25:57 writer:pprp 题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少? 用ST表即可实现 一开始无脑套模板,找了最大值,找了最小值 ...
- Java类继承关系中的初始化顺序
Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...
- GEO--工具 ScanGEO
http://scangeo.dartmouth.edu/ScanGEO/ ScanGEO - parallel mining of high-throughput gene expression d ...
- Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 离散化+逆元
E. Mike and Geometry Problem time limit per test 3 seconds memory limit per test 256 megabytes input ...