[Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)
Description
给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价。起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权
N<=100000
M<=200000
Solution
这题关键在于化边为点,把无向边拆成2条有向边
考虑最直白的一种建图方法,对于每一个点u,它的每一条入边向所有出边连边
但这样边数太多了,最坏是\(M^2\)条边,不可行
考虑用差值来建图,每条出边向第一条比它大的出边连一条权值为权差值的边,并且反向连一条权值为0的边
然后每条入边向对应的出边连一条为自身权值的边
设一个超级源点S和汇点T,S向1的所以出边连边,n的所以出边向T连边
这样边数是m级别的,然后跑最短路即可,
这题边数较多,我用spfa过不了,用Dijkstra堆优化可以过
Code
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#define ll long long
#define Pa pair<ll,int>
using namespace std;
struct info{int to,nex,w;}e[400010],ne[2000010];
int n,m,tot=1,head[400010],nhead[400010],S,T;
ll dis[400010];
priority_queue<Pa,vector<Pa>,greater<Pa> > q;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void Link(int u,int v,int w){
e[++tot].to=v;e[tot].w=w;e[tot].nex=head[u];head[u]=tot;
}
inline void nLink(int u,int v,int w){
ne[++tot].to=v;ne[tot].w=w;ne[tot].nex=nhead[u];nhead[u]=tot;
}
bool cmp(int a,int b){return e[a].w<e[b].w;}
int tmp[400010],tp;
void Build(){
tot=1;
S=1,T=m*2+2;
for(int i=1;i<=n;++i){
tp=0;
for(int j=head[i];j;j=e[j].nex) tmp[++tp]=j;
sort(tmp+1,tmp+tp+1,cmp);
for(int j=1;j<=tp;++j){
int u=tmp[j],nex=tmp[j+1];
if(e[u].to==n) nLink(u,T,e[u].w);
if(i==1) nLink(S,u,e[u].w);
nLink(u^1,u,e[u].w);
if(j<tp) nLink(u,nex,e[nex].w-e[u].w),nLink(nex,u,0);
}
}
}
void Dijkstra(){
for(int i=S;i<=T;++i)dis[i]=1ll<<60;
q.push(make_pair(0,S));
dis[S]=0;
while(!q.empty()){
int u=q.top().second;
ll Dis=q.top().first;
q.pop();
if(Dis>dis[u]) continue;
for(int i=nhead[u];i;i=ne[i].nex){
int v=ne[i].to;
if(dis[v]>dis[u]+ne[i].w){
dis[v]=dis[u]+ne[i].w;
q.push(make_pair(dis[v],v));
}
}
}
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;++i){
int u=read(),v=read(),w=read();
Link(u,v,w);
Link(v,u,w);
}
Build();
Dijkstra();
printf("%lld\n",dis[T]);
return 0;
}
[Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)的更多相关文章
- 【BZOJ-4289】Tax 最短路 + 技巧建图
4289: PA2012 Tax Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 168 Solved: 69[Submit][Status][Dis ...
- [BZOJ4289] [PA2012] Tax 解题报告 (最短路+差分建图)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 4289: PA2012 Tax Time Limit: 10 Sec Memo ...
- 【BZOJ-4289】Tax 最短路 + 技巧建图(化边为点)
题意 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权N<=10 ...
- POJ-1122 FDNY to the Rescue!---Dijkstra+反向建图
题目链接: https://vjudge.net/problem/POJ-1122 题目大意: 给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路 ...
- 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)
传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...
- HDU5521 Meeting(dijkstra+巧妙建图)
HDU5521 Meeting 题意: 给你n个点,它们组成了m个团,第i个团内有si个点,且每个团内的点互相之间距离为ti,问如果同时从点1和点n出发,最短耗时多少相遇 很明显题目给出的是个无负环的 ...
- bzoj4289 PA2012 Tax——点边转化
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 好巧妙的转化!感觉自己难以想出来... 参考了博客:https://blog.csdn ...
- BZOJ4289 : PA2012 Tax
一个直观的想法是把每条边拆成两条有向边,同时每条有向边是新图中的一个点.对于两条边a->b与b->c,两点之间连有向边,费用为两条边费用的最大值.然后新建源点S与汇点T,由S向所有起点为1 ...
- [BZOJ4289][PA2012]TAX(最短路)
首先考虑一种暴力做法,为每条边拆成两条有向边,各建一个点.若某两条边有公共点,则在边所对应的点之间连一条边,权值为两条边中的较大值.这样跑最短路是$O(m^2\log m)$的. 用类似网络流中补流的 ...
随机推荐
- DIV内数据删除操作
对于数据操作,前端提供静态方法,交给后台去操作 此处记录一下,待优化,不过精华都在里面了 静态页面: 鼠标移上显示: html代码 css代码 js代码
- iOS - The identity used to sign the executable is no longer valid
①.首先在xcode中的Build Settings中看有没有设置: ②.账号是不是多个人在用,个人开发者的账号只能绑定一台电脑,当另外一台电脑绑定了话,你的电脑就失效了.你确认下是不是这个原因造成的 ...
- TeeChart for .NET常用属性总结
本文总结了图表控件Teechart for .NET常用的一些属性,对图表开发人员来说是一个很好的参考. 原文链接:http://blog.csdn.net/u010270772/article/de ...
- Android 5.0 以上监听网络变化
大家好,大概有一个多月没有更新博客了,我是干什么去了呢?很明显,程序员当然要加班……这一次跟大家分享一下新项目的一些心得. 监听网络变化在开发中是经常用到的,例如我们断网有一些友好的提示,或者根据不同 ...
- Java—包装类、Date和SimpleDateFormat、Calendar类
包装类 基本数据类型不能调用方法,功能简单,为了让基本数据类型也具备对象的特性,Java为每个基本数据类型提供了一个包装类,这样就可以像操作对象那样来操作基本数据类型. 基本类型和包装类之间的对应关系 ...
- Cordova各个插件使用介绍系列(八)—$cordovaCamera筛选手机图库图片并显示
原文档请看http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/ionic%E5%9B%BE%E7%89%87%E4%B8%8A%E4%B ...
- Azure 进阶攻略 | 文件完整性,你打算如何证明?
假设你是一位独立软件开发者,通过自己的网站提供软件下载.网站完全托管在 Azure 中,并且软件下载也是通过 Azure Blob 存储和 Azure CDN 服务提供的. 这做法真不错,不需要自己管 ...
- Spring Cloud入门程序
本文手把手教你,做出第一个Spring Cloud程序,Eureka的简单入门使用 1.创建Spring Starter Project工程 点击next,添加项目名 2.引入Spring Cloud ...
- kubernetes组件helm
1.安装helm Helm由客户端helm命令行工具和服务端tiller组成,Helm的安装十分简单. 下载helm命令行工具到master节点node1的/usr/local/bin下(只需要在其中 ...
- css样式设置高度不定文本垂直居中
使用css实现文本垂直居中,对于支持display: table的浏览器来说,是比较容易实现的,只需要对外层div设置为table,内层div设置为table-cell,并设置文本垂直居中即可.但对于 ...