博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3013 Big Christmas Tree (dij+优先级队列优化 求最短)
阅读量:6614 次
发布时间:2019-06-24

本文共 1322 字,大约阅读时间需要 4 分钟。

模板

意甲冠军:给你一个图,1始终根,每一方都有单价值,每个点都有权重新。

每个边缘的价格值 = sum(后继结点重)*单价方值。

最低价格要求树值,它构成了一棵树n-1条边的最小价值。

算法:

1、由于每一个边的价值都要乘以后来訪问的节点的权重。而走到后来訪问的点必经过这条边。

实际上总价值就是  到每一个点的最短路径*这个点的权重。

2、可是这个题 数据量真的太大了。50000个点,50000条边。

写普通的dij算法tle。

必须加优先队列优化- -

据说spfa也能过。可是spfa算法不稳定- -,一般没有负权,则用优先队列或堆优化的dijkstra算法

应该能解决这个问题。

3、坑点:点为0或者1时,价值为0,要特判。否则也会tle。

#include
#include
#include
#include
#include
#define maxn 50010const __int64 INF = 10000000000;using namespace std;struct node{ int to,next,val;}edge[maxn*2];int v,head[maxn],c[maxn],cnt;long long dis[maxn];bool vis[maxn];typedef pair
PII;priority_queue
,greater
> q;void add(int x,int y,int z){ edge[cnt].to = y; edge[cnt].val = z; edge[cnt].next = head[x]; head[x] = cnt++;}long long dij(){ for(int i=2;i<=v;i++) dis[i] = INF; while(!q.empty()) q.pop(); int sum = 0; long long ret = 0; long long x; int y; dis[1] = 0; q.push(make_pair(dis[1],1)); while(!q.empty()) { PII cur = q.top(); q.pop(); x = cur.first; y = cur.second; if(vis[y]) continue; vis[y] = true; sum++; ret += x*c[y]; for(int i=head[y];i!=-1;i=edge[i].next) { int u = edge[i].to,p = edge[i].val; if(dis[u]>dis[y]+p) { dis[u] = dis[y]+p; q.push(make_pair(dis[u],u)); } } } if(sum

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
编译mysql5.6.27
查看>>
搭建centos6.7网站服务器记录
查看>>
我的友情链接
查看>>
Release版本调用ffmpeg av_register_all程序崩溃
查看>>
Referenced management pack not found
查看>>
jquery中data函数的用法示例
查看>>
巧用strtotime函数计算日期
查看>>
JVM中java对象的生命周期
查看>>
mysql 查看连接数,状态
查看>>
JFinal集成YUI Compressor压缩合并JS和CSS
查看>>
windows下的Oracle卸载
查看>>
sqlserver查看死锁的存储过程
查看>>
在VirtualBox中的CentOS 6.3下安装VirtualBox增强包(GuestAd...
查看>>
Java开发中的23种设计模式详解(转)
查看>>
我的友情链接
查看>>
组策略18招
查看>>
关于Android中的数据存储
查看>>
Tomcat配置日志生产功能
查看>>
js的自执行函数
查看>>
移植Qt与Tslib到X210开发板的体会
查看>>