Big Christmas Tree

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

分析:直接求出每个节点到树根的最短距离距离,之后乘上自身节点的权值求和即可;

ps:注意特判v = 0;这时cnt = 1 > v;

Djistra + priority_queue

//Accepted    2804K    141MS
#include <cstdio>
#include <cstring>
#include <utility>
#include <queue>
#include <vector>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define inf 1LL<<40
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
const int N = ;
typedef __int64 ll;
typedef pair<__int64,int> lli;//距离,编号
#define A first
#define B second
priority_queue<lli , vector<lli> , greater<lli> > q;
int v,val[N];
int head[N<<],tot;
struct edge{
int to,w,Next;
}e[N<<];
void ins(int a,int b,int w = )
{
e[++tot].Next = head[a];
e[tot].to = b;
e[tot].w = w;
head[a] = tot;
}
ll d[N];bool vis[N];
ll Djistra()
{
ll ans = ,cnt = ;
d[] = ;
q.push(lli{d[],});
while(!q.empty()){
lli t = q.top();
q.pop();
int u = t.B;
if(vis[u]) continue;
cnt++;vis[u] = true;
ans += d[u]*val[u];
for(int id = head[u];id;id = e[id].Next){
int v = e[id].to,cost = e[id].w;
if(d[v] > d[u] + cost){
d[v] = d[u] + cost;
q.push(lli{d[v],v}); }
}
}
if(cnt < v) return -;
return ans;
}
int main()
{
int T,e,kase = ;
read1(T);
while(T--){
read2(v,e);
rep1(i,,v)
read1(val[i]),d[i] = inf,vis[i] = false;
MS0(head);tot = ;
rep0(i,,e){
int a,b,w;
read3(a,b,w);
ins(a,b,w);ins(b,a,w);
}
if(v <= )out();
else{
while(!q.empty()) q.pop();
ll ret = Djistra();
if(ret == -) printf("No Answer");
else out(ret);
}
puts("");
}
return ;
}

Djistra + heap

ps:heap中的最后的位置赋值要放在最后,不好直接在break中,因为可能是出边界了,而没有赋到需要的值;

//4116K    125MS    G++    2869B
#include <cstdio>
#include <cstring>
#include <utility>
#include <queue>
#include <vector>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define inf 1LL<<40
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
const int N = ;
typedef __int64 ll;
typedef pair<__int64,int> lli;
#define A first
#define B second
int v,val[N];
int head[N<<],tot;
struct edge{
int to,w,Next;
}e[N<<];
void ins(int a,int b,int w = )
{
e[++tot].Next = head[a];
e[tot].to = b;
e[tot].w = w;
head[a] = tot;
}
ll d[N];bool vis[N];
lli heap[N],q[N];int _cnt;
bool comp(lli x,lli y)
{
return x.A < y.A;//最小堆
}
inline void push(const lli x)
{
heap[++_cnt] = x;
int son,fa;
for(son = _cnt,fa = son>>;fa >= ;son = fa,fa = son>>){
if(comp(x,heap[fa]))
heap[son] = heap[fa];
else break;
}
heap[son] = x;
}
inline lli top()
{
return heap[];
}
inline void pop()
{
lli tmp = heap[] = heap[_cnt--];
int son ,fa;
for(fa = ,son = fa<<;son <= _cnt;fa = son,son = fa<<){
if(son < _cnt && comp(heap[son|],heap[son]))
son++;
if(comp(tmp,heap[son]))break;
else heap[fa] = heap[son];
}
heap[fa] = tmp;
}
ll Djistra()
{
ll ans = ,cnt = ;
d[] = ;
push(lli{d[],});
while(_cnt){
lli t = top();
pop();
int u = t.B;
if(vis[u]) continue;
cnt++;vis[u] = true;
ans += d[u]*val[u];
for(int id = head[u];id;id = e[id].Next){
int v = e[id].to,cost = e[id].w;
if(d[v] > d[u] + cost){
d[v] = d[u] + cost;
push(lli{d[v],v});
}
}
}
if(cnt < v) return -;
return ans;
}
int main()
{
int T,e,kase = ;
read1(T);
while(T--){
read2(v,e);
rep1(i,,v)
read1(val[i]),d[i] = inf,vis[i] = false;
MS0(head);tot = ;
rep0(i,,e){
int a,b,w;
read3(a,b,w);
ins(a,b,w);ins(b,a,w);
}
if(v <= )out();
else{
_cnt = ;
ll ret = Djistra();
if(ret == -) printf("No Answer");
else out(ret);
}
puts("");
}
return ;
}

poj 3013 Big Christmas Tree Djistra的更多相关文章

  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 Big Christmas Tree

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

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

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

  5. SPFA/Dijkstra POJ 3013 Big Christmas Tree

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

  6. POJ Big Christmas Tree(最短的基础)

    Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the ...

  7. POJ3013 Big Christmas Tree[转换 最短路]

    Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23387   Accepted: 5 ...

  8. Big Christmas Tree(poj-3013)最短路

    Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 25823   Accepted: 5 ...

  9. 【POJ 2486】 Apple Tree(树型dp)

    [POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8981   Acce ...

随机推荐

  1. Vi、Vim及Gedit编辑器

    搜索(注意,不需要输入:号.也可以先输入:号再键入命令) /string……………………向后搜索,从光标处向文件尾搜索,按n键继续搜索下一个 ?string……………………向前搜索 注意:搜索时会将所 ...

  2. java_jdbc_可滚动结果集与分页

    public static void create2(int i) { Connection conn = null; Statement st = null; ResultSet rs = null ...

  3. Tips: compilation and creating new projects on Android 4.0

    If you have downloaded android 4.0, you should read the article. $ANDROID_ROOT/tools/android.bat is ...

  4. Eclipse 常用快捷键与使用技巧总结

    一.实用类快捷键 1 常用熟悉的快捷键 CTRL+C(复制).CTRL+X(剪切).CTRL+Z(撤销).CTRL+F(查找).CTRL+H(搜索文件或字符串).CTRL+/(双斜杠注释).ALT+/ ...

  5. FBReaderJ 编译Jni

    最近要做一个电子书项目用到FBReaderJ 第一步,也是最难的一步,要编译他的Jni 文件,对于android开发还是小白的我,只能说难!好难!非常难!,于是乎百度了一下,找到几篇有价值性的文章 第 ...

  6. table tr分离并加圆角和阴影

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. -bash: lampp: command not found解决方案

    在/opt目录下安装完lampp后,需要到/opt/lampp/下执行lampp启动或者停止服务,如果在其余目录下执行lampp,会提示:-bash: lampp: command not found ...

  8. npm更换淘宝镜像

    镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry https://regist ...

  9. 轻松学习Ionic (三) 安装sass并在webstorm中为scss添加watcher

    1. 安装Ruby 最新为 2.1.5版本,不放心的话安装 Ruby 1.9.3-p551    安装过程中注意勾选上第二项!即将Ruby加入到可执行的环境变量中去.       安装结束后在命令行中 ...

  10. Magento中直接使用SQL语句

    原理: magento是基于Zend Framework的,所以底层用的还是zend的zend db 在文件app/code/core/Mage/Catalog/model/Resource/Eav ...