[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)$的. 用类似网络流中补流的 ...
随机推荐
- iptables防火墙规则的添加、删除、修改、保存
原文地址:https://blog.csdn.net/educast/article/details/52093390 本文介绍iptables这个Linux下最强大的防火墙工具,包括配置iptabl ...
- sql存储过程中使用 output、nvarchar(max)
1.sql存储过程中使用 output CREATE PROCEDURE [dbo].[P_Max] @a int, -- 输入 @b int, -- 输入 @Returnc int output - ...
- UVA-10375 唯一分解定理
#include<iostream> #include<string.h> #include<algorithm> #include<math.h> # ...
- C. Prefixes and Suffixes
链接 [https://codeforces.com/contest/1092/problem/C] 题意 给你某个字符串的长度n,再给你2*n-2个前缀或者后缀 让你判断那些是前缀那些是后缀 关键是 ...
- redis的spring的xml配置
<!-- 集群版配置 --> <bean id="jedisCluster" class="redis.clients.jedis.JedisClust ...
- iOS开发——无网占位图的实现
https://www.jianshu.com/p/d537393fe247 https://github.com/wyzxc/CQPlaceholderViewhttps://github.com/ ...
- 03-命令图片.doc
- Linux下破解pycharm
1.下载 https://pan.baidu.com/s/119UO4SGIEW_cxf0LmZzx3w 并将 JetbrainsCrack-3.1-release-enc.jar 放置到 pycha ...
- Oracle 内存参数调优设置
Oracle 数据库系统中起到调节作用的参数叫初始化参数,数据库管理员根据实际情况需要适当调整这些 初始化参数以优化Oracle系统. 1 主要系统参数调优介绍 2 系统内存参数的分配 2.1 Ora ...
- Azure系列2.1.1 —— BlobContainerPermissions
(小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...