题目链接:

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

1
3 4
1 2 4
3 1 8
3 2 16
2 1 32
1 2 64
样例输出1

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(最小树形图)的更多相关文章

  1. bzoj4349: 最小树形图

    最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...

  2. hdu 4966 GGS-DDU (最小树形图)

    比较好的讲解:http://blog.csdn.net/wsniyufang/article/details/6747392 view code//首先为除根之外的每个点选定一条入边,这条入边一定要是 ...

  3. HDU 4966 GGS-DDU(最小树形图)

    n个技能,每个技能有0-a[i]的等级,m个课程,每个课程需要前置技能c[i]至少达到lv1[i]等级,效果是技能d[i]达到lv2[i]等级,花费w[i]. 输出最小花费使得全技能满级(初始全技能0 ...

  4. hdu3072 强连通+最小树形图

    题意:有一个人他要把一个消息通知到所有人,已知一些通知关系:A 能通知 B,需要花费 v,而又知道,如果某一个小团体,其中的成员相互都能直接或间接通知到,那么他们之间的消息传递是不需要花费的,现在问这 ...

  5. HDU4966 GGS-DDU(最小树形图)

    之前几天想着补些算法的知识,学了一下最小树形图的朱刘算法,不是特别理解,备了份模板以备不时之需,想不到多校冷不丁的出了个最小树形图,没看出来只能表示对算法不太理解吧,用模板写了一下,然后就过了.- - ...

  6. POJ3164 Command Network(最小树形图)

    图论填个小坑.以前就一直在想,无向图有最小生成树,那么有向图是不是也有最小生成树呢,想不到还真的有,叫做最小树形图,网上的介绍有很多,感觉下面这个博客介绍的靠谱点: http://www.cnblog ...

  7. HDU ACM 2121 Ice_cream’s world II (无根最小树形图)

    [解题思路]这题先看了NotOnlySuccess的解题思路,即设置虚根再处理的做法:弄了一个上午,再次有种赶脚的感觉~~如果需要找出为什么需要去比所有权值之和更大的数为新增的虚边的话,一开始我理解仅 ...

  8. Uva 11183 - Teen Girl Squad (最小树形图)

    Problem ITeen Girl Squad Input: Standard Input Output: Standard Output You are part of a group of n  ...

  9. POJ 3164 Command Network (最小树形图)

    [题目链接]http://poj.org/problem?id=3164 [解题思路]百度百科:最小树形图 ]里面有详细的解释,而Notonlysucess有精简的模板,下文有对其模板的一点解释,前提 ...

随机推荐

  1. NSURLSession 的学习资料

    一个nsurlsession的一些学习资料 http://www.cocoachina.com/ios/20161018/17785.html

  2. Html基本用法

    hmtl hyper text markup language  超文本标记语言 超文本:超越一般的文本 变色 加粗 变大 甚至设置超链接 标记:浏览器已经定义好的 一些由尖括号括起来的特殊符号 语言 ...

  3. Editor.md的安装使用(MarkDown)

    1.官网下载:http://pandao.github.io/editor.md/ 2.使用例子: <!DOCTYPE html> <html lang="zh-cn&qu ...

  4. Python学习札记(七) Basic4 条件判断

    参考:条件判断 Note 1.Python的条件判断关键字与C语言类似,if.else,以及elif,相当于C语言中的else if. 2.Python与C语言不一样的是,使用缩进来判断语句是否属于条 ...

  5. ABP 源码分析汇总之 AutoMapper

    AutoMapper 是一个对象映射工具, 安装时只需要安装 如下即可: 有关于它的介绍,参考官网:http://automapper.org/ AutoMapper使用比较简单,还是直奔主题,看一下 ...

  6. 在php中define和const定义常量的区别

    define和const都可以用来定义常量,但是const定义常量的时候大小写敏感,而define可以通过设置第三个参数为true的时候来取消大小写敏感! 如图: 引用地址:点这里

  7. 使用MessageFormat替换字符中的占位符

    使用String.format可以实现字符串的格式化功能,即将后面参数中的值替换掉format中的%s,%d这些值.但MessageFormat更为强大,不用管传入值是字符串还是数字,使用占位符即可. ...

  8. 可能是最好的 Rx 初学者教程

    译文:https://zhuanlan.zhihu.com/p/25552305 原文:https://gist.github.com/staltz/868e7e9bc2a7b8c1f754

  9. JSP 发送邮件

    JSP 发送邮件 虽然使用JSP实现邮件发送功能很简单,但是需要有JavaMail API,并且需要安装JavaBean Activation Framework. 在这里下载最新版本的 JavaMa ...

  10. JSP XML 数据处理

    JSP XML 数据处理 当通过HTTP发送XML数据时,就有必要使用JSP来处理传入和流出的XML文档了,比如RSS文档.作为一个XML文档,它仅仅只是一堆文本而已,使用JSP创建XML文档并不比创 ...