Big Christmas Tree
Time Limit: 3000MS   Memory Limit: 131072K
Total Submissions: 19029   Accepted: 4058

Description

Christmas is coming to KCM city. Suby the loyal civilian in KCM city is preparing a big neat Christmas tree. The simple structure of the tree is shown in right picture.

The tree can be represented as a collection of numbered nodes and some edges. The nodes are numbered 1 through n. The root is always numbered 1. Every node in the tree has its weight. The weights can be different from each other. Also the shape of every available edge between two nodes is different, so the unit price of each edge is different. Because of a technical difficulty, price of an edge will be (sum of weights of all descendant nodes) × (unit price of the edge).

Suby wants to minimize the cost of whole tree among all possible choices. Also he wants to use all nodes because he wants a large tree. So he decided to ask you for helping solve this task by find the minimum cost.

Input

The input consists of T test cases. The number of test cases T is given in the first line of the input file. Each test case consists of several lines. Two numbers ve (0 ≤ve ≤ 50000) are given in the first line of each test case. On the next line, v positive integers wi indicating the weights of v nodes are given in one line. On the following e lines, each line contain three positive integers abc indicating the edge which is able to connect two nodes a and b, and unit price c.

All numbers in input are less than 216.

Output

For each test case, output an integer indicating the minimum possible cost for the tree in one line. If there is no way to build a Christmas tree, print “No Answer” in one line.

Sample Input

2
2 1
1 1
1 2 15
7 7
200 10 20 30 40 50 60
1 2 1
2 3 3
2 4 2
3 5 4
3 7 2
3 6 3
1 5 9

Sample Output

15
1210 学习了一下SPFA算法,咋一看去以为这个题目是最小生成树,但是题目条件边的权值由子节点的点值和决定,这个就很纠结了,。。。在建树过程中,还要一边求某边的子节点,不是很蛋疼吗。。。后来大牛们都说是SPFA最短路求。。。推了一下,发现真是,当求出了源点1到各节点的最短路,再乘以节点值,再累加,就奇迹般的达到了上述效果 最短路就是用SPFA实现的,为了运用SPFA算法,首先还得学会使用邻接表。
邻接表和邻接矩阵的思想相反,邻接表存贮边信息,运用链表的思想将读入的所有边都存在一个链表中、
邻接表的实现是这样的,
for 1 to m
scanf a,b,c
u[i]=a,v[i]=b,w[i]=c;
next[i]=first[u[i]];
first[u[i]]=i;
稍微递推一下,发现,这链表是自尾向前链接的,主要就是它的next放在first前面,first里面保存u[i]节点是第几条边,初始化first数组全部为-1,这也就不难理解,如果u[i]是第一次读入,那next[i]值为-1,表示下面没有跟u[i]再相邻的未访问边了,而first数组的存在使得如果再次读入u[i]为初始节点,则马上更新。。到时候访问的时候实际上是从最新读入的边访问到最底层的边,有点类似于后进先出的栈的味道
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define maxn 50005
#define inf 0x7fffffffffffffff
using namespace std; int v[maxn*];
int u[maxn*];
int w[maxn*];
int pre[maxn*];
int next[maxn*];
long long d[maxn];
int vn[maxn];
bool isqueue[maxn];
void init(int n)
{
for (int i=;i<=n;i++)
{
d[i]=inf;
isqueue[i]=;
}
memset(pre,-,sizeof pre); //初始化邻接表的数组全为-1
}
int cnt;
void addedge(int be,int de,int ve) //建立邻接表
{
u[cnt]=be;
v[cnt]=de;
w[cnt]=ve;
next[cnt]=pre[be];
pre[be]=cnt++;
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int n,m;
scanf("%d %d",&n,&m);
init(n);
int i,j,k;
for (i=;i<=n;i++)
{
scanf("%d",&vn[i]);
}
cnt=;
for (j=;j<=m;j++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
addedge(a,b,c);
addedge(b,a,c);
}
d[]=;
queue<int> q;
q.push();
isqueue[]=;
while (!q.empty())//SPFA通过队列来实现
{
int vs=q.front();
q.pop();
isqueue[vs]=;
for (int qq=pre[vs];qq>=;qq=next[qq]) //访问与该节点相连的各条边,直至-1,即没有了边
{ if (d[v[qq]]>d[vs]+w[qq])
{
d[v[qq]]=d[vs]+w[qq];//将新点存入队列。
if (!isqueue[v[qq]])
{
q.push(v[qq]);
isqueue[v[qq]]=;
} }
}
}//循环结束即队列完全清空,这也是SPFA的精髓,一旦有点改动,就放入队列,再进行一遍边松弛,如果一直到队列清空,都没有点改动,说明此时已达到最短
d[]=;
bool flag=true;
for (k=;k<=n;k++)
{
if (d[k]==inf) {flag=false;break;}
d[]+=d[k]*vn[k]; //第一个点的点权值无需考虑,对求出的最短路和点值进行相乘累加即是最终答案
}
if (!flag) puts("No Answer");
else
printf("%lld\n",d[]);
}
return ;
}

POJ 3013 SPFA算法,邻接表的使用的更多相关文章

  1. POJ 1511 Invitation Cards (spfa的邻接表)

    Invitation Cards Time Limit : 16000/8000ms (Java/Other)   Memory Limit : 524288/262144K (Java/Other) ...

  2. hdu 1874 畅通工程(spfa 邻接矩阵 邻接表)

    题目链接 畅通工程,可以用dijkstra算法实现. 听说spfa很好用,来水一发 邻接矩阵实现: #include <stdio.h> #include <algorithm> ...

  3. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

  4. poj1273--Drainage Ditches(最大流Edmond-Karp算法 邻接表实现)

    最大流模板题 大部分Edmond-Karp算法代码都是邻接矩阵实现,试着改成了邻接表. #include <iostream> #include <cstdio> #inclu ...

  5. nyoj 239 月老的难题【匈牙利算法+邻接表】

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福 ...

  6. hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  7. ural 1109,NYOJ 239,匈牙利算法邻接表

    NYOJ 239:http://acm.nyist.net/JudgeOnline/problem.php?pid=239 ural 1109 :http://acm.timus.ru/problem ...

  8. ZSTU OJ 3999 零基础学算法---邻接表

    题目:Click here 题意:我就喜欢中文题! 分析:这个题虽然是中文题,但是还是有一点费解的.其实就是给你一棵树,是用图的形式给你的,只知道a,b之间有一条边,并不知道谁是父,谁是子.思路就是先 ...

  9. poj 3013 SPFA

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

随机推荐

  1. 关于 CDN 负载均衡 网页请求过程等

    链接 1 [转]浅谈一个网页打开的全过程(涉及DNS.CDN.Nginx负载均衡等)  https://www.cnblogs.com/xuan52rock/p/6845637.html 2 闲话 C ...

  2. YOKOGAWA ProSafe-RS 通道测试 CENTUMVP

    20180927 我并没有调试这个项目 仅仅是听同事讲解了 横河ProSafe-RS通道测试 然后做了笔记 软件安装并不在本记录中 ProSafe-RS版本 CENTUMVP版本 ProSafe-RS ...

  3. pyhton中matplotlib箱线图的绘制(matplotlib双轴图、箱线图、散点图以及相关系数矩阵图))

    //2019.07.23 1.箱形图,又称为盒式图,一般可以很好地反映出数据分布的特征,也可以进行多项数据之间分布特征的比较,它主要包含五个基础数据:中位数,两个上下分位数以及上下边缘线数据 其中的一 ...

  4. Java 布尔运算

    章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...

  5. sql server 2012插入排序后的数据到临时表无效

    IF OBJECT_ID('TEMPDB..#list') IS NOT NULLBEGIN DROP TABLE TEMPDB.#list END CREATE TABLE #list(OFC_ID ...

  6. HDU - 6197 array array array (最长上升子序列&最长下降子序列)

    题意:对于一个序列,要求去掉正好K个数字,若能使其成为不上升子序列或不下降子序列,则“A is a magic array.”,否则"A is not a magic array.\n&qu ...

  7. Rails 第一课:环境配置 Ruby Rails RVM Heroku

    安装 上传专案到 Heroku 安装 Ruby 2.3.1 Rails 5.0.0.1 RVM 1.27.0 比较幸运一个问题都未碰到 MacOS 10.12.1 配置完成系统顺利升级到10.12.2 ...

  8. 简单的js队列

    简单的js队列 /** * [Queue] * @param {[Int]} size [队列大小] */ function Queue(size) { var list = []; //向队列中添加 ...

  9. 开源DDD设计模式框架YMNNetCoreFrameWork第四篇-增加YMNSession,增加异常处理,增加策略授权

    1.增加YMNSession,可以获取当前登录的用户信息 2.增加异常处理,不要使用过滤器,过滤器只能获取到mvc异常 3.增加策略授权,策略授权支持用户角色.用户名授权,初步实现 代码地址:http ...

  10. Arduino函数

    输入输出函数 pinMode(pin, mode)将数位脚位(digital pin)指定为输入或输出.如:pinMode(7,INPUT); // 将脚位 7 设定为输入模式 digitalWrit ...