思路:ans = 每条边(u,v)*v的子树节点的w = 所有的dist[v]*w[v]之和;


#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#define MAX 500005
const long long int INF = 100000000000000;
using namespace std;
typedef struct{
int to, next, w;
}Node;
Node edge[MAX*2];
queue<int>q;
long long int vis[MAX], head[MAX], dist[MAX], W[MAX];
long long int ans;
void init(int n){
memset(vis, 0, sizeof(vis));
memset(head, -1, sizeof(head));
for(int i = 1;i <= n;i ++)
dist[i] = INF;
dist[1] = 0;
}
void spfa(int s){
while(!q.empty()) q.pop();
q.push(s);
vis[s] = 1;
while(!q.empty()){
int p =q.front();
q.pop();
vis[p] = 0;
for(int i = head[p];i != -1;i = edge[i].next){
int v = edge[i].to;
if(dist[v] > dist[p] + edge[i].w){
dist[v] = dist[p] + edge[i].w;
if(!vis[v]){
q.push(v);
vis[v] = 1;
}
}
}
}
}
void AddEdge(int i, int u, int v, int w){
edge[i].to = v;
edge[i].w = w;
edge[i].next = head[u];
head[u] = i;
}
int main(){
int T, n, e, u, v, price, k;
/* freopen("in.c", "r", stdin); */
scanf("%d", &T);
while(T--){
scanf("%d%d", &n, &e);
init(n);
for(int i = 1;i <= n;i ++)
cin >> W[i];
k = 0;
for(int i = 0;i < e;i ++){
scanf("%d%d%d", &u, &v, &price);
AddEdge(k++, u, v, price);
AddEdge(k++, v, u, price);
}
spfa(1);
int flag = 0;
ans = 0LL;
for(int i = 2;i <= n;i ++){
if(dist[i] == INF){
flag = 1;
break;
}
ans += W[i]*dist[i];
}
if(!flag) cout << ans << endl;
else cout << "No Answer\n";
}
return 0;
}

												

POJ 3013的更多相关文章

  1. POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)

    POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意:  圣诞树是由n个节点和e个边构成的,点编号1-n. ...

  2. poj 3013 Big Christmas Tree (最短路径Dijsktra) -- 第一次用优先队列写Dijsktra

    http://poj.org/problem?id=3013 Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total S ...

  3. poj 3013 最短路变形

    http://poj.org/problem?id=3013 给出n个点,m个边.给出每个点的权值,每个边的权值.在m条边中选n-1条边使这n个点成为一棵树,root=1,求这棵树的最小费用,费用=树 ...

  4. poj 3013 Big Christmas Tree

    Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 20974   Accepted: 4 ...

  5. poj 3013 Big Christmas Tree Djistra

    Big Christmas Tree 题意:图中每个节点和边都有权值,图中找出一颗树,树根为1使得 Σ(树中的节点到树根的距离)*(以该节点为子树的所有节点的权值之和) 结果最小: 分析:直接求出每个 ...

  6. poj 3013 Big Christmas Tree (dij+优先级队列优化 求最短)

    模板 意甲冠军:给你一个图,1始终根,每一方都有单价值,每个点都有权重新. 每个边缘的价格值 = sum(后继结点重)*单价方值. 最低价格要求树值,它构成了一棵树n-1条边的最小价值. 算法: 1. ...

  7. poj 3013 SPFA

    首先看题看的很懵.. 然后这题直接没想用Djstra做 TLE了.看discuss,Dijstra要用堆优化,也可以用SPFA做. 这里在网上找了这两种做法的区别,点多稠密图用Dij,以为它是操作点的 ...

  8. POJ 3013最短路变形....

    DES:计算输的最小费用.如果不能构成树.输出-1.每条边的费用=所有的子节点权值*这条边的权值.计算第二组样例可以知道树的费用是所有的节点的权值*到根节点的最短路径的长度. 用dij的邻接矩阵形式直 ...

  9. SPFA/Dijkstra POJ 3013 Big Christmas Tree

    题目传送门 题意:找一棵树使得造价最少,造价为每个点的子节点造价和*边的造价和 分析:最短路跑出1根节点到每个点的最短边权值,然后每个点的权值*最短边距和就是答案,注意INF开足够大,n<=1特 ...

随机推荐

  1. rpm的一些用法

    rpm2cpio *.rpm | cpio -imd     #解压一个rpm包 rpm -ivh *.rpm  --force         #强制安装这个rpm包 rpm -ivh *.rpm  ...

  2. AJAX安全-Session做Token

    个人思路,请大神看到了指点 个人理解token是防止扫号机或者恶意注册.恶意发表灌水,有些JS写的token算法,也会被抓出来被利用,个人感觉还是用会过期的Session做token更好,服务器存储, ...

  3. 【pano2vr】网页Flash中简单实现炫酷的3D模型制作

    花了两天时间学习如何能够高效的实现3D模型效果,毕竟是从0开始学习,感觉pano2vr这款软件挺容易上手,并且可以很容易实现简单的热点交互,可以根据交互需求设置皮肤,故将这一款软件推荐给大家: 1.简 ...

  4. WPF一个简单的垂直菜单样式的实现

    以前制作类似于垂直菜单功能的控件我都是Listbox和一个Popup实现的,今天尝试着用Menu做了一个简单垂直菜单,就当是做了个小练习写了这篇随笔~: 有什么不对的地方希望大家指正,分享和记录也是一 ...

  5. Git权威指南 读笔(4)

    第12章 改变历史: $ git commit --amend -m "Remove hello.h, which is useless." 修改提交说明 $ git log -- ...

  6. 使用PyInstaller打包Python程序

    本文转载自: http://www.pycoding.com/2015/04/23/pyinstaller.html

  7. Python中异常(Exception)的总结

    Python中的异常处理 异常处理的语句结构 try: <statements> #运行try语句块,并试图捕获异常 except <name1>: <statement ...

  8. Java Web 前端高性能优化(一)

    Web 发展的速度让许多人叹为观止,层出不穷的组件.技术,只需要合理的组合.恰当的设置,就可以让 Web 程序性能不断飞跃.所有 Web 的思想都是通用的,它们也可以运用到 Java Web.这一系列 ...

  9. linux-0.11内核 任务的堆栈切换

    http://blog.163.com/di_yang@yeah/blog/static/86118492201212534924900/ 一直缠绕的两个问题:怎样标识的内核栈与用户栈?如何在内核态堆 ...

  10. easyui源码翻译1.32--Dialog(对话框窗口)

    前言 扩展自$.fn.window.defaults.使用$.fn.dialog.defaults重写默认值对象.下载该插件翻译源码 该对话框是一种特殊类型的窗口,它在顶部有一个工具栏,在底部有一个按 ...