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. 如何在mac上創建txt文档

    文件編輯(Mac下的記事本),shift + command + T 進入純文字編輯模式!

  2. C语言结构体赋值2

    #include <stdio.h> /** 上一个版本的name是固定大小的,不好,这次换用 *name然后 采用 堆的方式申请内存,起到用到少拿多少的一个方式. */ struct s ...

  3. nginx配置文件特殊字符说明

    开发过程中经常重复配置nginx.conf,对里面的特殊字符始终不太明白具体的意义,今天百度nginx配置看到一篇不错的文章,转载记录下来,以备不时之需. nginx rewrite 正则表达式匹配 ...

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

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

  5. [记录]ns_error_unexpected firefox tinymce

    参考: Form not saving, NS_ERROR_UNEXPECTED  Error: NS_ERROR_UNEXPECTED #794 NS_ERROR_UNEXPECTED on Fir ...

  6. Android IntentService使用

    因为多数启动服务不必同时处理多个请求(在多线程情景下会很危险),所以使用IntentService类实现服务是很好的选择.本经验将通过继承IntentService输出当前时间教大家如何使用Inten ...

  7. Android开发之Service

    什么是Service? Android中的服务与Activity不同,他是不能与用户进行交互,自己也不能启动在后台运行的程序,当我们退出应用时,Service应用并没有结束,它仍然在后台运行. 例子: ...

  8. 2013年全国各大著名的IT公司薪资待遇大揭密

    以下为转载,特此说明!--西电好网 ============================================ 1: 本人西电通院2013届毕业硕士,根据今年找工作的情况以及身边同学的汇 ...

  9. Ext.Net 布局

    Ext.Net 布局 Panel布局类有10种:容器布局,自适应布局,折叠布局,卡片式布局,锚点布局,绝对位置布局,表单布局,列布局,表格布局,边框布局       1,Ext.layout.Cont ...

  10. ASP.NET 使用C#代码设置页面元素中的样式或属性

    在HTML元素的属性中加上runat ="server"和ID="MyTag"即可在后台代码中通过设置MyTag.Style的值来控制样式. 例如:在前端页面加 ...