一个直观的想法是把每条边拆成两条有向边,同时每条有向边是新图中的一个点。对于两条边a->b与b->c,两点之间连有向边,费用为两条边费用的最大值。然后新建源点S与汇点T,由S向所有起点为1的边连边,T接受所有终点为n的边,那么答案就是S到T的最短路。

这样子的边数为$O(m^2)$,不能承受。

考虑枚举中转点x,将所有与它有关的边按费用从小到大排序。对于每条边,从以x为终点的点向以x为起点的点连边,费用为该边的费用。从以x为起点的点向下一条边连边,费用为两条边费用的差值,向上一条边连边,费用为0。

这样子建图,边数为$O(m)$,可以承受。

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,ll> PI;
const int N=100010,M=200010;
int n,m,i,j,x,y,z,cnt,t,S,T;
int g[N],en[M<<1],st[M<<1],nxt[M<<1],ed;
int G[M<<1],V[M*6],W[M*6],NXT[M*6],ED;
ll d[M<<1];
priority_queue<PI,vector<PI>,greater<PI> >Q;
struct P{int x,y,z;P(){}P(int _x,int _y,int _z){x=_x,y=_y,z=_z;}}a[M<<1],q[M];
inline bool cmp(const P&a,const P&b){return a.z<b.z;}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void addedge(int x,int y,int z){en[++ed]=y;st[ed]=z;nxt[ed]=g[x];g[x]=ed;}
inline void add(int x,int y,int z){V[++ED]=y;W[ED]=z;NXT[ED]=G[x];G[x]=ED;}
int main(){
read(n),read(m);
while(m--){
read(x),read(y),read(z);
a[++cnt]=P(x,y,z);
a[++cnt]=P(y,x,z);
addedge(x,cnt,cnt-1);
addedge(y,cnt-1,cnt);
}
for(i=1;i<=n;i++){
for(t=0,j=g[i];j;j=nxt[j])q[++t]=P(en[j],st[j],a[en[j]].z);
if(!t)continue;
sort(q+1,q+t+1,cmp);
for(j=1;j<=t;j++)add(q[j].x,q[j].y,q[j].z);
for(j=1;j<t;j++){
add(q[j].y,q[j+1].y,q[j+1].z-q[j].z);
add(q[j+1].y,q[j].y,0);
}
}
S=cnt+1;T=S+1;
for(i=1;i<=cnt;i++){
if(a[i].x==1)add(S,i,a[i].z);
if(a[i].y==n)add(i,T,a[i].z);
}
for(i=1;i<=T;i++)d[i]=1LL<<60;
Q.push(PI(d[S]=0,S));
while(!Q.empty()){
PI t=Q.top();Q.pop();
if(d[x=t.second]<t.first)continue;
for(i=G[x];i;i=NXT[i])if(d[x]+W[i]<d[V[i]])Q.push(PI(d[V[i]]=d[x]+W[i],V[i]));
}
return printf("%lld",d[T]),0;
}

  

BZOJ4289 : PA2012 Tax的更多相关文章

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

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

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

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

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

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

  4. bzoj4289 PA2012 Tax——点边转化

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

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

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

  6. 「BZOJ 4289」 PA2012 Tax

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

  7. 【PA2012】【BZOJ4289】Tax

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

  8. bzoj 4289: PA2012 Tax

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

  9. ●BZOJ 4289 PA2012 Tax

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

随机推荐

  1. Vim的使用方法

    导读 Vim是从vi发展出来的一个文本编辑器.代码补全.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器. 一.vi.vim介绍 ...

  2. git参考资料

    个人博客 http://www.iwangzheng.com/ $git log --graph $git reset --hard 67889898... $ssh-add $git pull -- ...

  3. HDU 1707 简单模拟 Spring-outing Decision

    Spring-outing Decision Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  4. MySQL Profiling 的使用

    MySQL Profiling 的使用 在本章第一节中我们还提到过通过 Query Profiler 来定位一条 Query 的性能瓶颈,这里我们再详细介绍一下 Profiling 的用途及使用方法. ...

  5. 【云计算】Docker集中化web界面管理平台shipyard

    Docker集中化web界面管理平台shipyard docker shipyard seanlook                        2015年01月05日发布             ...

  6. Merge Two Sorted Arrays

    Merge two given sorted integer array A and B into a new sorted integer array. Example A=[1,2,3,4] B= ...

  7. Android 中获得notification的发出时间

    最近做程序时,有一个类似闹钟的功能,用notification唤醒程序后,希望能得到发出这个notification时的具体时间,就是notification右边写着的那个时间.查了notificat ...

  8. 17.Python笔记之memcached&redis

    作者:刘耀 博客:www.liuyao.me 博客园:www.cnblogs.com/liu-yao 一.Memcached 1.介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动 ...

  9. [Android Pro] 监听WIFI 打开广播

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-perm ...

  10. 【转】Quartus II调用modelsim无缝仿真

    Quartus II调用modelsim无缝仿真  ★emouse 思·睿博客文章★ 原创文章转载请注明:http://emouse.cnblogs.com 本篇文章为转载,写的不错,最近在学mode ...