Description

给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价。起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权
N<=100000
M<=200000

Sample Input

4 5
1 2 5
1 3 2
2 3 1
2 4 4
3 4 8

Sample Output

12
 
 
很容易想到暴力:化边为点,每两个点中间的边权为两个原来边的更大的权,如图,红色的点是新点:
 
但是,如果出现了菊花图,那么新边的个数会变成M^2,原地爆炸,我们必须优化建边。
考虑把原来的无向边,变成两条有向边,也就是在新图上把一个点拆成两个点,这两个点之间的边权是原边的边权。
对于每一个原图上的点,把它的所有出边进行排序,每条出边从小到大连一条两个边权之差的边,如图:
 
这样运用查分建图,就好比,我要过这个点,原来是一起交了钱,现在建完图是先交进入的钱,再将出边和入边的差补交上去。
然后,再将新图建立S、T分别是源点的汇点。将S连向所有原图起点的出边,所有原图终点的入边连向T。
最后图会成为这个样子:
当然,最后跑一边Dijkstra,SPFA会被卡。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cstdlib>
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
#define MAXN 400040
using namespace std;
inline int read(){
int x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int n,m;
int S,T;
int total,head[MAXN],to[MAXN*],nxt[MAXN*],val[MAXN*];
int Total,Head[],To[],Nxt[],Val[];
int vis[];
long long dis[];
struct edge{
int id,va;
}st[MAXN*];
struct node{
int a;
long long b;
bool operator <(const node &x)const{
return b>x.b;
}
};
priority_queue<node> Q;
inline int change(int x){
if(x%==) return x+;
return x-;
}
inline void adl(int a,int b,int c){
total++;
to[total]=b;
val[total]=c;
nxt[total]=head[a];
head[a]=total;
return ;
}
inline void Adl(int a,int b,int c){
Total++;
To[Total]=b;
Val[Total]=c;
Nxt[Total]=Head[a];
Head[a]=Total;
return ;
}
inline bool cmp(edge a,edge b){
return a.va<b.va;
}
inline void solve(int u){
int cnt=;
for(int e=head[u];e;e=nxt[e]) st[++cnt].id=e,st[cnt].va=val[e];
sort(st+,st+cnt+,cmp);//对于u的所有出边排序
REP(i,,cnt-) Adl(st[i].id,st[i+].id,st[i+].va-st[i].va),Adl(st[i+].id,st[i].id,);//连查分边
for(int e=head[u];e;e=nxt[e]) Adl(change(e),e,val[e]);//每一条出边连向所对入边
return ;
}
inline long long Dijkstra(){
memset(dis,0x7f,sizeof(dis));
dis[S]=;
node p;
p.a=S,p.b=;
Q.push(p);
while(!Q.empty()){
int u=Q.top().a;Q.pop();
if(vis[u]) continue;
vis[u]=;
for(int e=Head[u];e;e=Nxt[e])
if(dis[To[e]]>dis[u]+Val[e]){
dis[To[e]]=dis[u]+Val[e];
node q;
q.a=To[e],q.b=dis[To[e]];
Q.push(q);
}
}
return dis[T];
}
int main(){
in(n),in(m);
int a,b,c;
REP(i,,m) in(a),in(b),in(c),adl(a,b,c),adl(b,a,c);
S=,T=total+;
for(int e=head[];e;e=nxt[e]) Adl(S,e,val[e]);//处理源点
for(int e=head[n];e;e=nxt[e]) Adl(change(e),T,val[e]);//处理汇点
for(int i=;i<=n;i++) solve(i);
printf("%d",Dijkstra());
return ;
}
/*
4 5
1 2 5
1 3 2
2 3 1
2 4 4
3 4 8
*/
 
 

bzoj4289 Tax的更多相关文章

  1. BZOJ4289 Tax 最短路建模

    给定一个带边权的无向图,求1到n的最小代价路径.经过一个点的代价是路径上这个点的入边和出边的较大权值. \(n \le 100000, m \le 200000\). 一般的建图是考虑每个点,其入边和 ...

  2. 【BZOJ-4289】Tax 最短路 + 技巧建图

    4289: PA2012 Tax Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 168  Solved: 69[Submit][Status][Dis ...

  3. [BZOJ4289] [PA2012] Tax 解题报告 (最短路+差分建图)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 4289: PA2012 Tax Time Limit: 10 Sec  Memo ...

  4. BZOJ4289 : PA2012 Tax

    一个直观的想法是把每条边拆成两条有向边,同时每条有向边是新图中的一个点.对于两条边a->b与b->c,两点之间连有向边,费用为两条边费用的最大值.然后新建源点S与汇点T,由S向所有起点为1 ...

  5. [BZOJ4289][PA2012]TAX(最短路)

    首先考虑一种暴力做法,为每条边拆成两条有向边,各建一个点.若某两条边有公共点,则在边所对应的点之间连一条边,权值为两条边中的较大值.这样跑最短路是$O(m^2\log m)$的. 用类似网络流中补流的 ...

  6. [Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...

  7. 【PA2012】【BZOJ4289】Tax

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值.求从起点1到点N的最小代价. 起点的代价是离开起点的边的边权.终点的代价是进入终点的边的 ...

  8. bzoj4289 PA2012 Tax——点边转化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 好巧妙的转化!感觉自己难以想出来... 参考了博客:https://blog.csdn ...

  9. 【BZOJ-4289】Tax 最短路 + 技巧建图(化边为点)

    题意 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权N<=10 ...

随机推荐

  1. bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...

  2. Codeforces Round #519 题解

    A. Elections 题意概述 给出 \(a_1, \ldots, a_n\),求最小的 \(k (k \ge \max a_i)\), 使得 \(\sum_{i=1}^n a_i < \s ...

  3. css框架,一把锋利的剑

    CSS 框架是一系列 CSS 文件的集合体,包含了基本的元素重置,页面排版.网格布局.表单样式.通用规则等代码块,用于简化web前端开发的工作,提高工作效率. 产生原因 互联网行业已经发展了多年,浏览 ...

  4. ASP.NET中异常处理的注意事项

    一.ASP.NET中需要引发异常的四类情况 1.如果运行代码后,造成内存泄漏.资源不可用或应用程序状态不可恢复,则引发异常.Console这个类中,有很多类似这样的代码: if ((value < ...

  5. mysql Keepalived 实践

    Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,通过配合Nginx可 ...

  6. MySQL5.7 GTID在线开启与关闭【转】

    当前场景   当前某些业务还有未开启GTID服务组,升级5.7后,如何检测是否符合开启GTID条件,如何在线修改切换使用GTID:已经升级5.7后,已经开启GTID,如何快速回滚后退: 线上gtid如 ...

  7. elasticsearch如何使用?

    ES和关系型数据库的数据对比 1.创建索引库PUT/POST都可以,索引库名称必须全部小写,不能以下划线开头,也不能包含逗号curl -XPUT 'http://192.168.136.131:920 ...

  8. Gentoo rc-update service ‘net.eth0′ does not exist

    最近迷上了Gentoo,并相信以后也会把更多的精力放在Gentoo上,不过Gentoo的安装的过程的确让很多人却步. 本文只提到添加net.eth0到默认的运行级别时一个很小的报错解决. # nano ...

  9. Java基础84 javaBean规范

    1.javaBean的概述 1.javaBeam(咖啡豆)是一种开发规范,也可以说是一种技术.  2.JavaBean就是一个普通java类,只要符合以下规定才能称作为javaBean:        ...

  10. 基于bootstrap的上传插件fileinput实现ajax异步上传功能(支持多文件上传预览拖拽)

    首先需要导入一些js和css文件 ? 1 2 3 4 5 6 <link href="__PUBLIC__/CSS/bootstrap.css" rel="exte ...