poj 3013 Big Christmas Tree Djistra
题意:图中每个节点和边都有权值,图中找出一颗树,树根为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的更多相关文章
- POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)
POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n. ...
- poj 3013 Big Christmas Tree (最短路径Dijsktra) -- 第一次用优先队列写Dijsktra
http://poj.org/problem?id=3013 Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total S ...
- poj 3013 Big Christmas Tree
Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 20974 Accepted: 4 ...
- poj 3013 Big Christmas Tree (dij+优先级队列优化 求最短)
模板 意甲冠军:给你一个图,1始终根,每一方都有单价值,每个点都有权重新. 每个边缘的价格值 = sum(后继结点重)*单价方值. 最低价格要求树值,它构成了一棵树n-1条边的最小价值. 算法: 1. ...
- SPFA/Dijkstra POJ 3013 Big Christmas Tree
题目传送门 题意:找一棵树使得造价最少,造价为每个点的子节点造价和*边的造价和 分析:最短路跑出1根节点到每个点的最短边权值,然后每个点的权值*最短边距和就是答案,注意INF开足够大,n<=1特 ...
- POJ Big Christmas Tree(最短的基础)
Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the ...
- POJ3013 Big Christmas Tree[转换 最短路]
Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 23387 Accepted: 5 ...
- Big Christmas Tree(poj-3013)最短路
Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 25823 Accepted: 5 ...
- 【POJ 2486】 Apple Tree(树型dp)
[POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8981 Acce ...
随机推荐
- java_jdbc_反射技术将查询结果封装为对象
package cn.itcast.Reflect; import java.lang.reflect.InvocationTargetException; import java.lang.refl ...
- 解读eXtremeComponents代码结构--转载
原文地址:http://blog.csdn.net/lark3/article/details/1937466 大致整理了去年写的东西,罗列如下: ec是一系列提供高级显示的开源JSP定制标签,当前的 ...
- iOS 开发中使用 NSURLProtocol 拦截 HTTP 请求
这篇文章会提供一种在 Cocoa 层拦截所有 HTTP 请求的方法,其实标题已经说明了拦截 HTTP 请求需要的了解的就是 NSURLProtocol. 由于文章的内容较长,会分成两部分,这篇文章介绍 ...
- 学习jQuery后的部分总结
1.remove和empty <div id="div1"> <ul id="ul1"> <li>嘿嘿</li> ...
- PowerShell 批量增加ACL
$serviceName="云服务名称"$vmName="虚拟机名称"$endPoint="终结点名称"$acl=New-AzureAclC ...
- nginx查看日志
原文:nginx日志格式及自定义日志配置 nginx的log日志分为access log 和 error log 其中access log 记录了哪些用户,哪些页面以及用户浏览器.ip和其他的访问信息 ...
- Fedora 19修改主机名
Distribution为Fedora 19 方式一(重启后失效,需root权限): hostname 新主机名 [root@promote hadoop]# hostname promote.cac ...
- tcpdf MultiCell line break
在程序中,我遇到MultiCell中显示三个字符串,开始时 $pdf->MultiCell(63.5, 30, $name."\n".$address."\n&qu ...
- webbroswer 后台注入脚本 的方法
HtmlElement script = webBrowser.Document.CreateElement("script"); script.SetAttribute(&quo ...
- 浅谈用java解析xml文档(三)
接上一篇,本文介绍使用JDOM解析xml文档, 首先我们还是应该知道JDOM从何而来,是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初, JDOM作 ...