题目:http://poj.org/problem?id=3013

看似生成树,实则最短路,可以将题意转化为点权*根到此点的边权和(最短路使其最小)。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
queue<int>q;
int t,n,m,head[],ct,s[];
bool in[];
ll dis[],INF=1e10,ans;
struct N{
int to,next,w;
N(int t=,int n=,int ww=):to(t),next(n),w(ww) {}
}edge[];
int main()
{
scanf("%d",&t);
while(t--)
{
ct=;
memset(head,,sizeof head);
memset(in,,sizeof in);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&s[i]),dis[i]=INF;
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
edge[++ct]=N(y,head[x],z);head[x]=ct;
edge[++ct]=N(x,head[y],z);head[y]=ct;
}
while(q.size())q.pop();
dis[]=;q.push();in[]=;
while(q.size())
{
int x=q.front();q.pop();
in[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(dis[u]>dis[x]+edge[i].w)
{
dis[u]=dis[x]+edge[i].w;
if(!in[u])in[u]=,q.push(u);
}
}
}
bool flag=;ans=;
for(int i=;i<=n;i++)
{
if(dis[i]==INF)
{
flag=;break;
}
ans+=dis[i]*s[i];
}
if(flag)printf("No Answer\n");
else printf("%lld\n",ans);
}
return ;
}

最新文章

  1. [笔记]ng2的webpack配置
  2. 浅谈web语义化
  3. git 远程版本库,github提供服务原理,git自动更新发送邮件
  4. amazon o2 - reverse second half linked list
  5. Maven工程中的右键team
  6. CXF(2.7.10) - A simple JAX-WS service
  7. Cocos2d-x手机游戏开发中-组合动作
  8. Java 8:如何使用流方式查询数据库?
  9. U3D物理碰撞总结
  10. 【转载】运维小技巧:使用ss命令代替 netstat
  11. C# Word常用操作(转)格式设置
  12. May 31. 2018 Week 22nd Thursday
  13. js 操作对象 记录
  14. windows安装mysql8
  15. laravel 解决session保存不了,取不出的问题
  16. linux安装memcached安装以及memcache的php扩展
  17. WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)
  18. [Selenium.2.Testing.Tools.Beginners.Guide]读书笔记
  19. iOS UI基础-5.0 QQ框架(Storyboard)
  20. ci与cd的全称

热门文章

  1. wifi认证Portal开发系列(二):FreeRadius的安装和测试、关联Mysql
  2. .NET C# 【小技巧】控制台程序,运行是否弹出窗口选择!
  3. Spring MVC学习纲要
  4. ASP.NET动态网站制作(12)-- JQ(4)
  5. mysql随机查询
  6. MV45AOZZ 销售订单增强点
  7. PYTHON调用C接口(基于Ctypes)实现stein算法最大公约数的计算
  8. 【AWS】亚马逊云常用服务解释
  9. Spark与缓存
  10. 【栈】日志分析(BSOJ2981)