BZOJ 4289: PA2012 Tax 差分建图 最短路
https://www.lydsy.com/JudgeOnline/problem.php?id=4289
https://www.cnblogs.com/clrs97/p/5046933.html claris的题解很清晰
如果单纯把无向边拆成有向边然后变成点再连有向边需要建m^2条边。
那么这里可以差分建图压缩新图边的数量,把原图每个点的出边和入边排序,权值相同的出边到入边(开始是无向图所以每个出边一定有权值相同的入边,入边也是)连一条权值为相同权值的边。
(从小到大排序后)每条出边往它的前一条边连一条权值为0的边,向后一条边连一条权值为 (后一条边权值)-(当前边权值) 的边。
最后设置一个总入点和总出点相应连1的出边和n的入边就可以了。
合理性就不再说了。
空间要注意,这道题空间开小了wa开大了tle。卡了半天......
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
#define LL long long
#define pa pair<LL,int>
const int maxn=;
int n,m;
struct node{ int x,y;LL v; }a[maxn*],b[maxn*];int cnt=;
struct nod1{ int y,z,next; }e1[maxn*];
struct nod{ int y,next;LL v;}e[maxn*];
int head1[maxn]={},head[maxn*]={},tot1=,tot=;
priority_queue< pa ,vector< pa > , greater< pa > >q;
int S,T; LL dis[maxn*]={};
inline void init1(int x,int y,int z){e1[++tot1].y=y;e1[tot1].z=z;e1[tot1].next=head1[x];head1[x]=tot1;}
inline void init(int x,int y,LL v){e[++tot].y=y;e[tot].v=v;e[tot].next=head[x];head[x]=tot;}
bool mcmp(node aa,node bb){return aa.v<bb.v;}
void Dij(){
memset(dis,,sizeof(dis));
dis[S]=;q.push(make_pair(dis[S],S));
while(!q.empty()){
LL v=q.top().first;int x=q.top().second;q.pop();
if(v>dis[x])continue;
for(int i=head[x];i;i=e[i].next){
if(dis[e[i].y]>dis[x]+e[i].v){
dis[e[i].y]=dis[x]+e[i].v;
q.push(make_pair(dis[e[i].y],e[i].y));
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
int x,y;LL z;
for(int i=;i<=m;i++){
scanf("%d%d%lld",&x,&y,&z);
a[++cnt].x=x;a[cnt].y=y;a[cnt].v=z;
a[++cnt].x=y;a[cnt].y=x;a[cnt].v=z;
init1(x,cnt,cnt-);init1(y,cnt-,cnt);//入边 出边
}
S=cnt+;T=S+;
for(int i=;i<=n;i++){
int zz=;
for(int j=head1[i];j;j=e1[j].next){
b[++zz].x=e1[j].y; b[zz].y=e1[j].z; b[zz].v=a[e1[j].y].v;
}
sort(b+,b++zz,mcmp);
for(int j=;j<=zz;j++)init(b[j].x,b[j].y,b[j].v);
for(int j=;j<zz;j++){init(b[j+].y,b[j].y,); init(b[j].y,b[j+].y,b[j+].v-b[j].v);}
}
for(int i=;i<=cnt;i++){
if(a[i].y==n)init(i,T,a[i].v);
if(a[i].x==)init(S,i,a[i].v);
}
Dij();
printf("%lld\n",dis[T]);
return ;
}
BZOJ 4289: PA2012 Tax 差分建图 最短路的更多相关文章
- ●BZOJ 4289 PA2012 Tax
●赘述题目 算了,题目没有重复的必要. 注意理解:对答案造成贡献的是每个点,就是了. 举个栗子: 对于如下数据: 2 1 1 2 1 答案是 2: ●题解 方法:建图(难点)+最短路. 先来几个链接: ...
- bzoj 4289: PA2012 Tax
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- BZOJ.4289.PA2012 Tax(思路 Dijkstra)
题目链接 \(Description\) 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价 ...
- bzoj 4289 PA2012 Tax——构图
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 可以把一个点上的边按权值排序,然后边权小的向第一个比它大的连差值的边,边权大的向第一个 ...
- BZOJ 4289: PA2012 Tax(最短路)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 755 Solved: 240[Submit][Status][Discuss] Descriptio ...
- 【刷题】BZOJ 4289 PA2012 Tax
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- BZOJ 4289: PA2012 Tax Dijkstra + 查分
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- [BZOJ4289] [PA2012] Tax 解题报告 (最短路+差分建图)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 4289: PA2012 Tax Time Limit: 10 Sec Memo ...
- uva10067 Playing with Wheels 【建图+最短路】
题目:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1008">uva10067 Play ...
随机推荐
- Eureka简介
Eureka是Spring Cloud Netfix 的一个子模块,也是核心模块之一,用于云端服务发现.一个基于RestFul的服务,用于定位服务,以实现云端中间层服务发现和中间层转移. 服务注册与发 ...
- 再战CS231-数组的访问
1.切片访问和整形访问的区别 你可以同时使用整型和切片语法来访问数组.但是,这样做会产生一个比原数组低阶的新数组 import numpy as np # Create the following r ...
- Nginx常见错误与问题之解决方法技术指南
Nginx常见错误与问题之解决方法技术指南. 安装环境: 系统环境:redhat enterprise 6.5 64bit 1.Nginx 常见启动错误 有的时候初次安装nginx的时候会报这样的 ...
- JBoss6.1.0修改启动jvm内存以及修改日志级别【转】
转自 JBoss6.1.0修改启动jvm内存以及修改日志级别 - liangbinny的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/liangbinny/arti ...
- 【hdu6334】【2018Multi-University-Training Contest04】Problem C. Problems on a Tree
维护1边的联通块和2边的联通块,合并的时候直接启发式合并. cdqz的大爷好强啊. #include<bits/stdc++.h> #define lson (o<<1) #d ...
- 09 Command Documentation 命令文档
Command Documentation 命令文档 There is a suite of programs to build and process Go source code. Inste ...
- 【前端vue开发】vue项目使用sass less扩展语言所要安装的依赖
1.创建一个基于 webpack 模板的新项目 $ vue init webpack myvue 2.在当前目录下,安装依赖 $ cd myvue $ npm install 3.安装sass的依赖包 ...
- cross apply 和 outer apply
使用APPLY运算符可以实现查询操作的外部表表达式返回的每个调用表值函数.表值函数作为右输入,外部表表达式作为左输入. 通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出.A ...
- sqlserver字符串合并(merge)方法汇总
--方法1--使用游标法进行字符串合并处理的示例.--处理的数据CREATE TABLE tb(col1 varchar(10),col2 int)INSERT tb SELECT 'a',1UNIO ...
- django-suit的使用
1.django-suit 是Django admin美化插件 django-suit官方文档 2.django-suit安装 #python pip install django-suit #pyt ...