[BZOJ4289] [PA2012] Tax 解题报告 (最短路+差分建图)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4289
4289: PA2012 Tax
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1029 Solved: 310
[Submit][Status][Discuss]
Description
Sample Input
1 2 5
1 3 2
2 3 1
2 4 4
3 4 8
Sample Output
12
比较有技巧的建图
首先考虑暴力点的建图:
把每条无向边拆成两条有向边.把每条边看成一个点,对于两条边a->b,b->c
在这两条边之间连有向边,边权为这两条边的权值的较大值.
新建源点S,汇点T, S向所有从1连出去的边连边,所有指向n的边向T连边. 求S->T的最短路即可.
这样的复杂度会达到O(m2)
考虑优化一下:
考虑利用差值来建边.
依然把每条边x-y拆成x->y,y->x.
枚举每个中转点x. 将x的出边按权值排序,x的每条入边向对应的出边连该边权值的边(i对应i^1)),x的每条出边向第一个比它大的出边连两边权差值的边,x的每条出边向第一个比它小的出边连权值为0的边. 新建源汇S,T S向每条1的出边连权值为该边边权的边.每条n的入边向T连该边权值的边.
仔细看图,L2>L1,发现从S到T的路径走的一定是L2,而不是L1;注意结合上述的建图过程(红色边)
跑S->T的最短路即可.
这样的复杂度是O(mlogm)就可以AC
我的SPFA被T了,估计没写错只是被卡了
以上内容部分参考DaD3zZ大佬的博客
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define ll long long
using namespace std; const int N=+;
int n,m,tot1,tot2,S,T;
int head[N],h[N<<],st[N<<],vis[N<<];
ll dist[N<<];
struct EDGE
{
int to;int next;int l;
}edge[N<<],e[N<<];
inline int read()
{
char ch=getchar();
int s=,f=;
while (!(ch>=''&&ch<='')) {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void init()
{
memset(head,-,sizeof(head));
memset(h,-,sizeof(h));
memset(dist,0x3f3f3f3f,sizeof(dist));
}
void addedge(int x,int y,int l)
{
edge[tot1]=(EDGE){y,head[x],l};
head[x]=tot1++;
}
bool cmp(int x,int y) {return edge[x].l<edge[y].l;}
void addroad(int x,int y,int l)
{
e[tot2]=(EDGE){y,h[x],l};
h[x]=tot2++;
}
void build()
{
S=*(m+)+;T=*(m+)+;
for (int i=;i<=n;i++)
{
int tp=;
for (int j=head[i];j!=-;j=edge[j].next)
st[++tp]=j;
sort(st+,st++tp,cmp);
for (int j=;j<=tp;j++)
{
int now=st[j],suc=st[j+];
if (edge[now].to==n) addroad(now,T,edge[now].l);
if (i==) addroad(S,now,edge[now].l);
addroad(now^,now,edge[now].l);
if (j<tp) {addroad(now,suc,edge[suc].l-edge[now].l);addroad(suc,now,);}
}
}
}
priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > > q;
void Dijkstra()
{
q.push(make_pair(,S));
dist[S]=;
while (!q.empty())
{
int now=q.top().second;
ll Dis=q.top().first;q.pop();
if (Dis>dist[now]) continue;
for (int i=h[now];i!=-;i=e[i].next)
if (dist[now]+e[i].l<dist[e[i].to])
{
dist[e[i].to]=dist[now]+e[i].l;
q.push(make_pair(dist[e[i].to],e[i].to));
}
}
}
int main()
{
n=read();m=read();
init();
for (int i=;i<=m;i++)
{
int x=read(),y=read(),l=read();
addedge(x,y,l);addedge(y,x,l);
}
build();
Dijkstra();
printf("%lld\n",dist[T]);
return ;
}
[BZOJ4289] [PA2012] Tax 解题报告 (最短路+差分建图)的更多相关文章
- BZOJ 4289: PA2012 Tax 差分建图 最短路
https://www.lydsy.com/JudgeOnline/problem.php?id=4289 https://www.cnblogs.com/clrs97/p/5046933.html ...
- 【BZOJ-4289】Tax 最短路 + 技巧建图
4289: PA2012 Tax Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 168 Solved: 69[Submit][Status][Dis ...
- [Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- 【BZOJ-4289】Tax 最短路 + 技巧建图(化边为点)
题意 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权N<=10 ...
- LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]
题意 一个 \(n\) 个点的完全图,两点之间的边权为 \((i\ xor\ j)*C\) ,同时有 \(m\) 条额外单向路径,问从 \(S\) 到 \(T\) 的最短路. \(n\leq 10^5 ...
- [BZOJ4289][PA2012]TAX(最短路)
首先考虑一种暴力做法,为每条边拆成两条有向边,各建一个点.若某两条边有公共点,则在边所对应的点之间连一条边,权值为两条边中的较大值.这样跑最短路是$O(m^2\log m)$的. 用类似网络流中补流的 ...
- BZOJ4289 : PA2012 Tax
一个直观的想法是把每条边拆成两条有向边,同时每条有向边是新图中的一个点.对于两条边a->b与b->c,两点之间连有向边,费用为两条边费用的最大值.然后新建源点S与汇点T,由S向所有起点为1 ...
- bzoj4289 PA2012 Tax——点边转化
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 好巧妙的转化!感觉自己难以想出来... 参考了博客:https://blog.csdn ...
- 灯光照射,圆形探测类问题(解题报告)<分层差分><cmath取整>
题目描述 一个n*n的网格图上有m个探测器,每个探测器有个探测半径r,问这n*n个点中有多少个点能被探测到. 输入输出格式 输入格式: (1<=r<n<=5000) (1<=m ...
随机推荐
- C/C++拾遗(一):关于数组的指针和数组元素首地址的一道经典题
代码例如以下: #include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; int *ptr = (int *)(&am ...
- 【JavaEE WEB 开发】Tomcat 具体解释 Servlet 入门
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/47146817 一. Tomcat 下载安装配置 1. Tomcat 下载 T ...
- 基于One-Class的矩阵分解方法
在矩阵分解中. 有类问题比較常见,即矩阵的元素仅仅有0和1. 相应实际应用中的场景是:用户对新闻的点击情况,对某些物品的购买情况等. 基于graphchi里面的矩阵分解结果不太理想.调研了下相关的文献 ...
- Post请求方式长度參数过长导致參数为空
Post提交方式本身对于參数的长度没有限制,HTTP协议也没有限制. 可是今天在做一个web项目的时候碰到一个问题,当要提交的表单内容达到一定大小时,发现后台代码接收到的參数为空. 查询了一下.发现是 ...
- 源泉书签,助您管理海量收藏。www.yuanquanshuqian.com 今日更新:支持了导入url为js代码的书签
源泉书签,助您管理海量收藏.www.yuanquanshuqian.com 今日更新:支持了导入url为js代码的书签
- bzoj4554: [Tjoi2016&Heoi2016]游戏(二分图匹配)
4554: [Tjoi2016&Heoi2016]游戏 题目:传送门 题解: 一道很牛逼的匈牙利..和之前模拟赛的一道题有点相似(不过这题不用完美匹配) 我们可以把连续的行和列全部编号(如果之 ...
- javaScript常用知识点有哪些
javaScript常用知识点有哪些 一.总结 一句话总结:int = ~~myVar, // to integer | 是二进制或, x|0 永远等于x:^为异或,同0异1,所以 x^0 还是永远等 ...
- 集群版本升级——rolling upgrade在ES 单节点从 restart 到加入集群,大概要 100s 左右的时间。也就是说,这 100s 内,该节点上的所有分片都是 unassigned 状态
集群版本升级 Elasticsearch 作为一个新兴项目,版本更新非常快.而且每次版本更新都或多或少带有一些重要的性能优化.稳定性提升等特性.可以说,ES 集群的版本升级,是目前 ES 运维必然要做 ...
- Page Layout里的javascript (jquery)不执行
在page layout 中通过 _spBodyOnLoadFunctionNames.push("js 方法名") 的方式实现. 但切记,代码要放到 PlaceHolderMai ...
- activity(工作流)初步学习记录
1.概念 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期 ...