Description

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

Input

Output

Sample Input

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

Sample Output

12

HINT

Source

首先考虑暴力的做法,把无向边拆为两条,把边当做点,如果两条边之间有交点,就连边,边权为两个点所代表的边的边权较大者;

然后这样的边数为n^2,然后我们可以考虑用差分的思想优化连边;

我们把原图中每个点的出边进行排序,然后边权小的点往边权大的点连差值的权值,然后大的往小的连0的权值,然后每条边对应的两个点连边权为原图权值的边;

这样做相当于从小往大走,用差分累加答案,然后从大的往小走最大值就是自己,所以权值为0,

然后通过第三种边完成了入边和出边的转化,中间的边权代表入边的边权,并且割断了该入边与上一条出边的关系;

然后特殊处理S,T即可,Spfa 跑不过,系统堆Dijkstra跑得挺快的;

//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define RG register
using namespace std;
typedef long long ll;
const int N=500050;
const int M=2000050;
int n,m,cnt=1,tot,sta,T,tmp,to[M],edg[M],nxt[M],q[N],val[N],id[N],vis[N];
ll dis[N];
struct data{int x,y,z;}a[N];
struct graph{
int head[N];
void lnk(int x,int y,int z){
to[++tot]=y; edg[tot]=z; nxt[tot]=head[x]; head[x]=tot;
}
}g1,g2;
bool cmp(const data &u,const data &v){return u.z<v.z;}
struct date{
int x;ll d;
bool operator <(const date b) const{return d>b.d;}
};
priority_queue <date> Q;
void Dijkstra(){
memset(dis,127,sizeof(dis));
dis[1]=0;Q.push((date){1,0});
while(!Q.empty()){
int x=Q.top().x;Q.pop();
if(vis[x])continue;vis[x]=1;
for(RG int i=g2.head[x];i;i=nxt[i]){
int y=to[i];
if(dis[y]>dis[x]+edg[i]){
dis[y]=dis[x]+edg[i],Q.push((date){y,dis[y]});
}
}
}
}
int main(){
scanf("%d%d",&n,&m);RG int i,j,x,y,z,p;
for(i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
val[++cnt]=z; val[++cnt]=z;
g1.lnk(x,cnt,cnt-1);g1.lnk(y,cnt-1,cnt);
}
for(i=2;i<n;i++){
for(p=g1.head[i],tmp=0; p; p=nxt[p])
a[++tmp]=(data){to[p],edg[p],val[to[p]]};
if(!tot) continue;
sort(a+1,a+tmp+1,cmp);
for(j=1;j<=tmp;j++) g2.lnk(a[j].x,a[j].y,a[j].z);
for(j=1;j<tmp;j++){
g2.lnk(a[j].y,a[j+1].y,a[j+1].z-a[j].z);
g2.lnk(a[j+1].y,a[j].y,0);
}
}
T=++cnt;
for(p=g1.head[1];p;p=nxt[p]) g2.lnk(1,edg[p],val[edg[p]]);
for(p=g1.head[n];p;p=nxt[p]) g2.lnk(to[p],T,val[edg[p]]);
Dijkstra();printf("%lld\n",dis[T]);
return 0;
}

bzoj 4289: PA2012 Tax的更多相关文章

  1. BZOJ 4289: PA2012 Tax 差分建图 最短路

    https://www.lydsy.com/JudgeOnline/problem.php?id=4289 https://www.cnblogs.com/clrs97/p/5046933.html  ...

  2. bzoj 4289 PA2012 Tax——构图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 可以把一个点上的边按权值排序,然后边权小的向第一个比它大的连差值的边,边权大的向第一个 ...

  3. ●BZOJ 4289 PA2012 Tax

    ●赘述题目 算了,题目没有重复的必要. 注意理解:对答案造成贡献的是每个点,就是了. 举个栗子: 对于如下数据: 2 1 1 2 1 答案是 2: ●题解 方法:建图(难点)+最短路. 先来几个链接: ...

  4. BZOJ.4289.PA2012 Tax(思路 Dijkstra)

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

  5. 【刷题】BZOJ 4289 PA2012 Tax

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

  6. BZOJ 4289: PA2012 Tax(最短路)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 755  Solved: 240[Submit][Status][Discuss] Descriptio ...

  7. BZOJ 4289: PA2012 Tax Dijkstra + 查分

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

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

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

  9. 「BZOJ 4289」 PA2012 Tax

    「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...

随机推荐

  1. 《Java并发编程》之线程中断与终止线程运行

    Java中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线 ...

  2. TFboy养成记 MNIST Classification (主要是如何计算accuracy)

    参考:莫烦. 主要是运用的MLP.另外这里用到的是批训练: 这个代码很简单,跟上次的基本没有什么区别. 这里的lossfunction用到的是是交叉熵cross_entropy.可能网上很多形式跟这里 ...

  3. [react] 细数 React 的原罪

    Props & onChange 的原罪 .「props & onChange 接口规范」它不是一个典型的「程序接口规范」. 当你拿到一个可视组件的 ref,却没有类似 setProp ...

  4. 如何使用python将MySQL中的查询结果导出为Excel----xlwt的使用

    如何在MySQL中执行的一条查询语句结果导出为Excel? 一.可选方法 1.使用sql yog等远程登录,执行查询语句并导出结果集为Excel 适用于较简单的查询结果集的导出 如果需要多个SQL语句 ...

  5. 实践作业2:黑盒测试实践——选择并下载测试工具 Day 2

    1.选择工具为Katalon Studio 基于 Selenium 和 Appium 框架,Katalon Studio隐藏幕后的所有技术复杂性,并提供友好的用户界面与手动模式(用户可以拖放,选择关键 ...

  6. Batch Normalization

    一.BN 的作用 1.具有快速训练收敛的特性:采用初始很大的学习率,然后学习率的衰减速度也很大 2.具有提高网络泛化能力的特性:不用去理会过拟合中drop out.L2正则项参数的选择问题 3.不需要 ...

  7. SQL-删除重复记录

    前几日工作的时候,有个小需求,是要求删除一个表table_A里的重复记录(保留一条),假设以字段COL_PK重复来判断记录重复,那么有几种写法: 在Oracle里,可以利用rowid来删除,这是非常高 ...

  8. Sagit.Framework For IOS 开发框架入门教程3:Start引导页及框架布局和隐藏事件的内幕

    前言: 框架依旧在快速更新着:在重构.简化代码,统一标准的过程中. 中间也遇到各种坑,不过好在一步一脚印的解决了. 虽然还有些功能还在思考,不过教程,还是得补上: 上篇文章:Sagit.Framewo ...

  9. PHP curl_setopt函数用法介绍

    [导读] curl_setopt函数是php中一个重要的函数,它可以模仿用户的一些行为,如模仿用户登录,注册等等一些用户可操作的行为哦.bool curl_setopt (int ch, string ...

  10. 掌握sklearn系列——1 学会加载数据

    我们直接看代码: from sklearn import datasets #读取三组数据,前两个用于分类,第三个用于回归 iris = datasets.load_iris() digits = d ...