博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ:1738
阅读量:4061 次
发布时间:2019-05-25

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

楼教主男人八题第二题,5W个叶子节点合并最小费用

最小权费和二叉树:GW算法

#include 
#include
using namespace std;#define maxn 50050#define maxV 1000000001int S = 1;int L = 0;long long V[maxn];int LAST[maxn];int NEXT[maxn];int main(){ int n; while(scanf("%d",&n)!=EOF && n){ memset(V,0,sizeof(V)); memset(LAST,0,sizeof(LAST)); memset(NEXT,0,sizeof(NEXT)); L = n; S = 1; for(int i=1;i<=L;i++){ scanf("%lld",&V[i]); LAST[i] = i-1; NEXT[i] = i+1; } NEXT[L] = 0; V[0] = maxV; V[L+1] = maxV; long long ans = 0; int st = S; while(L>2){ int i = st; while(i!=0){ int a = LAST[i]; int b = NEXT[i]; if(V[a] <= V[b]){ V[a] += V[i]; ans += V[a]; NEXT[a] = b; LAST[b] = a; i = a; break; } i = NEXT[i]; } L--; int j = i; while(j!=0){ int j_last = LAST[j]; if(V[j_last] >= V[i]){ if(i==j) break; int a = LAST[i]; int b = NEXT[i]; NEXT[a] = b; LAST[b] = a; NEXT[i] = j; LAST[i] = j_last; LAST[j] = i; NEXT[j_last] = i; if(j_last == 0) S = i; break; } j = LAST[j]; } for(int k=0;k<2;k++){ if(i==S) break; i = LAST[i]; } st = i; } if(L==2) printf("%lld\n",ans+V[S]+V[NEXT[S]]); if(L==1) printf("0\n"); } return 0;}

转载地址:http://jkwji.baihongyu.com/

你可能感兴趣的文章
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>
Brackets安装及常用插件安装
查看>>
Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
查看>>
fastcgi_param 详解
查看>>
Nginx配置文件(nginx.conf)配置详解
查看>>
标记一下
查看>>