[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)$的. 用类似网络流中补流的 ...
随机推荐
- dos命令执行mysql的sql文件
1.cmd进入dos窗口 2.输入cd+ mysql的bin目录后进入bin文件下 3.进入控制台:mysql -uroot -proot 回车 4.选择数据库:use mydata go 回车 5 ...
- php 编译安装指导
php 编译安装 下载源码 安装 安装后配置 下载源码 php下载地址:http://php.net/downloads.php php-7.1.11.tar.bz2 安装 安装依赖包 yum ins ...
- Can't connect to any repository.Read timed out after 30,000 ms
解决方法:
- 百万级数据库SQL优化大总结
网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...
- 使用 Satis 搭建私有的 Composer 包仓库
简述 iBrand 产品立项时是商业性质的项目,但是在搭建架构时考虑后续的通用性,因此每个模块都设计成一个 Package,作为公司内部用,因此这些包并不能提交到 packagist.org 上去. ...
- 新人学习微信小程序开发之框架篇
大家好我是智哥,一名专注于前端领域的一名码农. 咱们今天主要来说说微信小程序, 最近一段时间微信群里的小程序,小游戏各种分享是突然一下子就爆发了,现在来看小程序作为微信的重磅功能无疑又是下一个风口.咱 ...
- 如何让Oracle数据库保持优良性能的方法
OracleDatabase,又名OracleRDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracle数据库系统是目前世界上流行 ...
- Leetcode 128. Longest Consecutive Sequence (union find)
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. Y ...
- IOS 设置颜色的的详情
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- java 通过接口在后台管理器中生成数据
需求:测试人员在后台批量添加数据很麻烦,特别是针对一款商品配置了英语,还需要手动添加法语.俄语.阿拉伯语,很麻烦,但是因为没有项目组配合,做个小工具批量生成数据就只有自己去研究了 第一步:通过抓包工具 ...