POJ3013 Big Christmas Tree(最短路径树)
题目大概说给一张点和边都有权的图,现在要求其一棵以1结点为根的生成树使树的边权和最小,树边权 = 对应的图边权 * 树边末端点为根的子树所有结点对于图顶点的点权和。
要求∑(边权*子树点权和),等价于求∑(点权*点到根路径上的边权和)。
而如果在图中各个点到根都存在最短路,那么最短路的边一定能构造出一棵生成树。一个构造方法就是在进行最短路的松弛操作时记录各点是从哪点转移的,而各点的这个前驱是唯一的这就对应着各点的父结点。这就是最短路径树。
那么这一题直接求各个点到1点的最短路,最后乘一下加一下就OK了。
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define INF (1LL<<60) 7 #define MAXN 55555 8 #define MAXM 55555*2 9 10 struct Edge{ 11 int v,w,next; 12 }edge[MAXM]; 13 int NE,head[MAXN]; 14 void addEdge(int u,int v,int w){ 15 edge[NE].v=v; edge[NE].w=w; edge[NE].next=head[u]; 16 head[u]=NE++; 17 } 18 19 long long d[MAXN]; 20 bool vis[MAXN]; 21 bool SPFA(int n){ 22 for(int i=1; i<=n; ++i){ 23 d[i]=INF; vis[i]=0; 24 } 25 d[1]=0; vis[1]=1; 26 queue<int> que; 27 que.push(1); 28 while(!que.empty()){ 29 int u=que.front(); que.pop(); 30 for(int i=head[u]; i!=-1; i=edge[i].next){ 31 int v=edge[i].v; 32 if(d[v]>d[u]+edge[i].w){ 33 d[v]=d[u]+edge[i].w; 34 if(!vis[v]){ 35 vis[v]=1; 36 que.push(v); 37 } 38 } 39 } 40 vis[u]=0; 41 } 42 for(int i=1; i<=n; ++i){ 43 if(d[i]==INF) return 0; 44 } 45 return 1; 46 } 47 48 int weight[MAXN]; 49 int main(){ 50 int t,n,m,a,b,c; 51 scanf("%d",&t); 52 while(t--){ 53 scanf("%d%d",&n,&m); 54 for(int i=1; i<=n; ++i){ 55 scanf("%d",weight+i); 56 } 57 NE=0; 58 memset(head,-1,sizeof(head)); 59 while(m--){ 60 scanf("%d%d%d",&a,&b,&c); 61 addEdge(a,b,c); 62 addEdge(b,a,c); 63 } 64 if(!SPFA(n)){ 65 puts("No Answer"); 66 continue; 67 } 68 long long ans=0; 69 for(int i=1; i<=n; ++i){ 70 ans+=d[i]*weight[i]; 71 } 72 printf("%lld\n",ans); 73 } 74 return 0; 75 }
转载于:https://www.cnblogs.com/WABoss/p/5475577.html
POJ3013 Big Christmas Tree(最短路径树)相关推荐
- POJ-3013: Big Christmas Tree(dij,spfa)
POJ-3013: Big Christmas Tree 题目链接:POJ:3013 Description Christmas is coming to KCM city. Suby the loy ...
- 最小生成树、最短路径树
一.最小生成树与最短路径树的区别 最小生成树能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径. 应用如网络部线,把所有的电脑(服务器?)都连起来用的网线(光纤?)最少,即用最小的 ...
- CF1527D MEX Tree(mex树容斥)
CF1527D MEX Tree(mex&树&容斥) 考虑简单容斥,meximex_imexi 等于包含[0,i−1][0,i-1][0,i−1]的所有路径减取包含[0,i][0,i ...
- Russian Dolls on the Christmas Tree
题目链接:Russian Dolls on the Christmas Tree 显然可以dfs序转区间之后上莫队,不过感觉会被卡. 其实也可以dfs序之后,对询问区间排序,然后线段树. 我懒得dfs ...
- poj 3013 Big Christmas Tree(最短路变形)
传送门:POJ 3013 Big Christmas Tree 描述: Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K To ...
- 最短路径树(SPT)介绍及matlab代码
文章目录 前言 一.最短路径树是什么? 二.最短路径树的算法 1.Dijkstra算法(我比较常用和喜欢的算法) 2.Floyd算法 总结 前言 最短路径树是路由算法设计中常用到的一种树,往往我们 ...
- 最短路径,最短路径树和最小生成树
首先介绍这三个概念,很多人都听过最短路径了,但是最短路径树却很少听过,关于最短路径树的介绍也不太多.而最短路径树和最小生成树更是完全不同的两个概念. 最短路径就是从一个指定的顶点出发,计算从该顶点出发 ...
- 点分治问题 ----------- P2993 [FJOI2014]最短路径树问题 [最短路径树+点分治+采坑]
题目链接 解题思路: 首先我们知道最小路径树实际上就是Dijkstra算法在找最短路的时候转移的过程就是一个最短路径树. 那么我们就可以先跑个最短路,记录一下各个最短路的路径.然后就是很裸的点分治.分 ...
- HDU 5385 The path(贪心、构造、最短路径树)
HDU 5385 题目大意:给定一个图,dis表示第i个点到1点的最短路,dis1=0,给有向图上的边赋权值(1~n)满足dis1<dis2<dis3<--<disk>d ...
最新文章
- Maven就是这么简单
- mysql监控内存cpu使用率_监控 cpu 内存 网卡的使用情况的一个命令 比较实用
- Android官方开发文档Training系列课程中文版:分享简单数据之添加简单的分享行为
- 35款安卓App被通报窃取个人隐私!快看看你的手机里有没有
- 连通子图什么意思_一道物理竞赛题揭开“希罗喷泉”的神秘面纱,到底什么物理原理?...
- pygame-KidsCanCode系列jumpy-part6-主角挂掉重新开始
- 在ASP.NET MVC5中实现具有服务器端过滤、排序和分页的GridView
- 几个大厂及 RCE漏洞二三事
- 分支限界法解决01背包问题
- delphi调用python_Delphi使用Python来解码邮件
- bzoj 2844: albus就是要第一个出场
- 2023长安大学物流管理专硕考研成功经验分享
- 昂达V971四核测评
- 星期、月份英文缩写对照表
- 【四二学堂】基于unicloud的跨平台项目-华夏画苑APP
- 0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded解决方法
- 【 [mmdetection] 如何在训练中断后,接着上次训练?】
- dango 自带的用户认证
- 物联网场景下,基于无线宽带的空中组网研究
- 14 Python 办公自动化
热门文章
- dockerfile的详细介绍
- MySQL 8.0版本安装后,安装目录下找不到my.ini文件
- python迭代器好处_关于Python中迭代器的作用
- python is not allowed to run_【无法解决】PySpider的部署运行而非调试界面上RUN运行
- node服务:日志、配置、路由与控制器
- Java设计模式之策略模式---写的比较有趣,推荐大家看看
- HBase总结(九)Bloom Filter概念和原理
- 一致性Hash(Consistent Hashing)原理剖析
- Parsing Netflow using Kibana via Logstash to ElasticSearch
- 快速排序算法QuickSort(二)