[PA2012] Tax
传送门:>Here<
题意:给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价。起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权N<=100000 M<=200000
解题思路
不免要吐槽一下这题的数据,久调一下午无果与标程对拍没有任何差错不知道为什么就是WA 既然极限数据已经和标程拍上了那么权当出了吧……
不过还是一道好题
首先考虑这道题暴力的做法——将每条边作为新图的点,然后枚举原图的点,遍历一遍这个点相邻的所有边,按照大小打擂在新图中连边,但是这样边的数量多达$M^2$
可以考虑优化边的数量,用到差分的思想——以其中一条边作为基准,往上走要加,往下走不加。作为基准的这一条边也就是当前路径的入边,至于出边,只需要沿着差分的边走就可以了。于是我们所需要做的就是将每个点相邻的所有边排序,并且相邻的连边——大的往小的权值为0,小的往大的权值为差值。并且对于每一条边,它的反向边应当与它连一条权值为其本身的边,作为基准嘛
Code
/*By DennyQi 2018.8.11*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define r read()
#define lr lread()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
;
;
const int INF = 1e18;
inline int read(){
; ; register int c = getchar();
')) c = getchar();
, c = getchar();
) + (x << ) + c - ', c = getchar(); return x * w;
}
inline int lread(){
ll x = ; ; register int c = getchar();
')) c = getchar();
, c = getchar();
) + (x << ) + c - ', c = getchar(); return x * w;
}
struct Edge{
ll len;
int idx;
}e[MAXM];
struct Dij{
ll w;
int idx;
};
inline bool operator < (const Dij& a, const Dij& b){
return a.w > b.w;
}
int N,M,x,y,S,T,v,top;
;
ll pcost[MAXM],cost[MAXM],z;
;
ll d[MAXM];
bool vis[MAXM];
priority_queue <Dij> q;
inline bool comp(const Edge& a, const Edge& b){
return a.len < b.len;
}
inline void add(int u, int v, int w){
// printf("%lld->%lld(%lld)\n",u,v,w);
to[++num_edge] = v;
cost[num_edge] = w;
nxt[num_edge] = first[u];
first[u] = num_edge;
}
inline void padd(int u, int v, int w){
pto[++pnum_edge] = v;
// printf("num(%lld): %lld->%lld(%lld)\n",pnum_edge,u,v,w);
pcost[pnum_edge] = w;
pnxt[pnum_edge] = pfirst[u];
pfirst[u] = pnum_edge;
){
add(S, pnum_edge, w);
}
if(v == N){
add(pnum_edge, T, w);
}
}
inline void Dijkstra(int s){
; i <= T; ++i) d[i] = INF;
d[s] = ;
q.push((Dij){,s});
ll u,v;
while(!q.empty()){
u = q.top().idx; q.pop();
if(vis[u]) continue;
vis[u] = ;
; i = nxt[i]){
v = to[i];
if(d[u] + cost[i] < d[v]){
d[v] = d[u] + cost[i];
q.push((Dij){d[v],v});
}
}
}
}
int main(){
// freopen(".in","r",stdin);
// freopen("qxz.out","w",stdout);
N = r, M = r;
memset(pfirst,-,sizeof(pfirst));
memset(first,-,sizeof(first));
S = M*+;
T = M*+;
// printf("S = %lld T = %lld\n",S,T);
; i <= M; ++i){
x = r, y = r, z = lr;
padd(x, y, z);
padd(y, x, z);
}
int v;
; x < N; ++x){
top = ;
; i = pnxt[i]){
e[++top] = (Edge){pcost[i], i};
}
sort(e+,e+top+,comp);
; i <= top; ++i){
if(i < top){
add(e[i].idx, e[i+].idx, e[i+].len-e[i].len);
}
){
add(e[i].idx, e[i-].idx, );
}
add(e[i].idx^, e[i].idx, e[i].len);
}
}
Dijkstra(S);
printf("%lld", d[T]);
;
}
[PA2012] Tax的更多相关文章
- 「BZOJ 4289」 PA2012 Tax
「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...
- [BZOJ4289] [PA2012] Tax 解题报告 (最短路+差分建图)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 4289: PA2012 Tax Time Limit: 10 Sec Memo ...
- BZOJ4289 : PA2012 Tax
一个直观的想法是把每条边拆成两条有向边,同时每条有向边是新图中的一个点.对于两条边a->b与b->c,两点之间连有向边,费用为两条边费用的最大值.然后新建源点S与汇点T,由S向所有起点为1 ...
- bzoj 4289: PA2012 Tax
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- ●BZOJ 4289 PA2012 Tax
●赘述题目 算了,题目没有重复的必要. 注意理解:对答案造成贡献的是每个点,就是了. 举个栗子: 对于如下数据: 2 1 1 2 1 答案是 2: ●题解 方法:建图(难点)+最短路. 先来几个链接: ...
- BZOJ.4289.PA2012 Tax(思路 Dijkstra)
题目链接 \(Description\) 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价 ...
- 【刷题】BZOJ 4289 PA2012 Tax
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- BZOJ 4289: PA2012 Tax 差分建图 最短路
https://www.lydsy.com/JudgeOnline/problem.php?id=4289 https://www.cnblogs.com/clrs97/p/5046933.html ...
- [BZOJ4289][PA2012]TAX(最短路)
首先考虑一种暴力做法,为每条边拆成两条有向边,各建一个点.若某两条边有公共点,则在边所对应的点之间连一条边,权值为两条边中的较大值.这样跑最短路是$O(m^2\log m)$的. 用类似网络流中补流的 ...
随机推荐
- (深度好文)重构CMDB,避免运维之耻
(深度好文)重构CMDB,避免运维之耻 CMDB,几乎是每个运维人都绕不过去的字眼,但又是很多运维人的痛,因为CMDB很少有成功的,因此我也把它称之为运维人的耻辱. 那么到底错在哪儿了?该如何去重构它 ...
- [转]WINDOWS服务器安全加固实战(WINDOWS SERVER 2008 R2和WINDOWS SERVER 2012)
主机安全 启用防火墙 阿里云windows Server 2008 R2默认居然没有启用防火墙.2012可能也是这样的,不过这个一定要检查! 补丁更新 启用windows更新服务,设置为自动更新状态, ...
- vue组件化开发组件拆分原则是什么
原则:可复用.可组合: 两大类:页面组件.功能组件: 除了公共头导航.侧导航.脚部内容,还有:
- Python学习第十八篇——低耦合函数设计思想
import json 2 def greet_user(filename): 3 try: 4 with open(filename) as f_obj: 5 username = json.loa ...
- PS调出水彩画效果古装人物照片
首先在PS里操作: 1.磨皮液化 磨皮液化就不细说啦~常规操作. 2.背景调色 分析:想塑造油画般的感觉,背景颜色想要蓝绿色 1.用可选颜色工具里面的中性色改变整体颜色,把皮肤和头发颜色用蒙版擦出来: ...
- vuex的购物车效果 index.js
import Vue from 'vue'; import Vuex, { Store } from 'vuex'; import { stat } from 'fs'; Vue.use(Vuex); ...
- [转帖]buffer与cache的区别
作者:沈万马链接:https://www.zhihu.com/question/26190832/answer/146259979来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- [转帖]全国产 台式机/笔记本/服务器都有 方正龙芯3A3000整机三连发
台式机/笔记本/服务器都有 方正龙芯3A3000整机三连发 2019年03月29日 17:17 4171 次阅读 稿源:快科技 7 条评论 https://www.cnbeta.com/article ...
- mybatis两种开发方式
本文首先讲解从JDBC到mybatis的演变过程,然后是使用mybatis进行开发的两种方式. 一 JDBC的使用及其优化 1.使用JDBC进行数据库操作 加载JDBC驱动: 建立并获取数据库连接: ...
- python爬虫之git的使用(windows下pycharm使用)
相信很多同学学会了git或者github以后都不知道怎么跟windows上的pycharm连在一起工作,那么下面我们开始介绍简单的安装和使用方法. 一.安装 1.首先你的有一个github的账户.注册 ...