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

Solution

这种边与边之间有特殊贡献的题目一般都是拆边为点

这题把每条边拆成两个点,把原来的点周围的边拆出的点排序后从权值低的向高的连权值为权值差的边,反向则连权值为 \(0\) 的边

看一看程序画一画就好了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
#define REP(a,b,c) for(register int a=(b),a##end=(c);a<=a##end;++a)
#define DEP(a,b,c) for(register int a=(b),a##end=(c);a>=a##end;--a)
const int MAXN=400000+10,MAXM=1000000+10;
const ll inf=1e18;
int n,m,beg[MAXN],nex[MAXM<<1],to[MAXM<<1],was[MAXM<<1],e;
ll d[MAXN];
std::priority_queue< std::pair<ll,int>,std::vector< std::pair<ll,int> >,std::greater< std::pair<ll,int> > > q;
std::vector<int> t;
std::vector< std::pair<int,int> > G[MAXN];
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void insert(int x,int y,int z)
{
to[++e]=y;
nex[e]=beg[x];
beg[x]=e;
was[e]=z;
}
#define ft first
#define sd second
inline bool cmp(std::pair<int,int> A,std::pair<int,int> B)
{
return A.sd<B.sd;
}
inline void build()
{
REP(i,1,n)
{
std::sort(G[i].begin(),G[i].end(),cmp);
REP(j,1,G[i].size()-1)
{
int u=G[i][j].ft,v=G[i][j-1].ft,w=G[i][j].sd-G[i][j-1].sd;
insert(u,v,w);insert(v,u,0);
}
}
}
inline ll Dijkstra()
{
REP(i,1,m<<1|1)d[i]=inf;
REP(i,0,G[1].size()-1)
{
d[G[1][i].ft]=0;
q.push(std::make_pair(0,G[1][i].ft));
}
while(!q.empty())
{
int x=q.top().sd;
if(q.top().ft!=d[x])
{
q.pop();
continue;
}
q.pop();
for(register int i=beg[x];i;i=nex[i])
if(d[to[i]]>d[x]+was[i])
{
d[to[i]]=d[x]+was[i];
q.push(std::make_pair(d[to[i]],to[i]));
}
}
ll ans=inf;
REP(i,0,G[n].size()-1)chkmin(ans,d[G[n][i].ft]+G[n][i].sd);
return ans;
}
#undef ft
#undef sd
int main()
{
read(n);read(m);
REP(i,1,m)
{
int u,v,w;read(u);read(v);read(w);
if(u>v)std::swap(u,v);
insert(i<<1,i<<1^1,w);insert(i<<1^1,i<<1,w);
G[v].push_back(std::make_pair(i<<1^1,w));
G[u].push_back(std::make_pair(i<<1,w));
}
build();
write(Dijkstra(),'\n');
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(最短路)

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

  4. bzoj 4289: PA2012 Tax

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

  5. ●BZOJ 4289 PA2012 Tax

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

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

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

  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. React等开发工具记录

    React Native :React 起源于 Facebook 的内部项目,结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生 ...

  2. kettle学习笔记(七)——kettle流程步骤与应用步骤

    一.概述 流程主要用来控制数据流程与数据流向 应用则是提供一些工具类 二.流程步骤 1.ETL元数据注入 类似Java中的反射,在设计时不知道文件名.文件位置等,在真正执行时才知道具体的一些配置等信息 ...

  3. 大数据入门第十二天——sqoop入门

    一.概述 1.sqoop是什么 从其官网:http://sqoop.apache.org/ Apache Sqoop(TM) is a tool designed for efficiently tr ...

  4. UWP 下载文件显示下载进度

    <Page x:Class="WgscdProject.TestDownloadPage" xmlns="http://schemas.microsoft.com/ ...

  5. effective c++ 笔记 (3-4)

    //---------------------------15/03/26---------------------------- 3:const函数的哲学思辨:就当是科普知识吧!如果成员函数是con ...

  6. 【绝对给力】Android开发免豆资料(教程+工具+源码)地址汇总

    教程下载: [免费]android界面效果全汇总.pdf http://down.51cto.com/data/209179 Android终极开发教程[pdf高清版] http://down.51c ...

  7. Java设计模式之适配器设计模式(项目升级案例)

    今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一 ...

  8. linux之grep 基础

    第一章 -a    将binary文件以text文件的方式搜寻数据-c    只输出匹配行的计数,计算找到匹配的次数-I(大写i)    不区分大小写(只适合用于单字符)-h    查询多文件时不显示 ...

  9. PS官方正式中文版(搬砖分享)

    https://pan.baidu.com/s/1c3IdQq0 PS官方正式中文版(搬砖分享) 注意事项: 1.安装开始前请先断网,在成功破解激活前请全程断网: 2.安装完成后先试运行软件一次,然后 ...

  10. 结对&词频统计

    结对编程 Pathner 濮成林(博客:http://www.cnblogs.com/charliePU/) 1.词频统计 环境依赖: 开发环境.myeclipse 2013, jdk1.7.0_04 ...