差分优化建边(Tax)
[Luogu P6822PA2012]Tax] (http://www.luogu.com.cn/problem/P6822")
All right. Let's go!
- 题目描述
给出一个 n 个点 m 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 1 到点 n 的最小代价。起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权。
这感觉非常棘手啊,这道题弯很多,首先不考虑连边建图,这道题该如何下手。
猜一猜:最短路算法是肯定的
可是在图论中通常是“ 停在点,经过边 ”,可这里是“ 经过点 ! ”,有没有一种反过来的感觉。
我们就用到了一种(类物理)的转换法
边点颠倒: 将边化为点,点化为边(连边时直接连存下来的边的编号即可)
但是直接这么连还是会超时,所以考虑连边建图
把无向边拆解为两条有向边
对于每个点,有几条进入它的入边,同样也有几条它延出的出边。我们按他们的边权从小到大排序
1.每条入边连相同所至点出边
2.而出边中,从前到后,E[i]->E[i+1] 权值为 E[i+1]-E[i] 反过来E[i+1]->E[i]权值为0
这里排序后,利用了差分 的思想
代码有点繁杂:
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+5;
typedef long long ll;
ll dis[N],Len[N];
int n,m,Tot,cnt,Nxt[N],To[N],Head[N];
bool mark[N];
struct node {
int num;ll w;
bool operator<(const node u) const{
return w<u.w;
}
};
vector<node> G[100005];
void add_edge(int u,int v,ll w) {
Tot++; Nxt[Tot]=Head[u]; Len[Tot]=w; To[Tot]=v; Head[u]=Tot;
}
struct Node {
int p;ll w;
bool operator<(const Node u) const{
return w>u.w;
}
};
priority_queue<Node> Q;
void DJ(int s) {
dis[s]=0;
Q.push((Node){s,0});
while(!Q.empty()) {
int u=Q.top().p; Q.pop();
if(mark[u]) continue;
mark[u]=true;
for(int i=Head[u];i;i=Nxt[i]) {
int v=To[i];
if(!mark[v]&&dis[v]>dis[u]+Len[i]) {
dis[v]=dis[u]+Len[i];
Q.push((Node){v,dis[v]});
}
}
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) {
int u,v; ll w;
scanf("%d%d%lld",&u,&v,&w);
G[u].push_back((node){i*2-1,w});
G[v].push_back((node){i*2,w}); //相邻的一条互为反向边
}
for(int i=1;i<=n;i++) {
sort(G[i].begin(),G[i].end());
}
for(int sz=G[1].size(),j=0;j<sz;j++) {
int v2=G[1][j].num,v1;
if(v2&1) v1=v2+1; else v1=v2-1;
add_edge(0,v2,G[1][j].w);
}
for(int i=2;i<n;i++) {
for(int sz=G[i].size(),j=0;j<sz;j++) {
int v2=G[i][j].num,v1; ll w=G[i][j].w;
if(v2&1) v1=v2+1; else v1=v2-1;
add_edge(v1,v2,w);
if(j) {
add_edge(G[i][j-1].num,v2,w-G[i][j-1].w);
add_edge(v2,G[i][j-1].num,0);
}
}
}
for(int sz=G[n].size(),j=0;j<sz;j++) {
int v2=G[n][j].num,v1;
if(v2&1) v1=v2+1; else v1=v2-1;
add_edge(v1,m*2+1,G[n][j].w);
// printf("%d %d %d\n",v.num,m*2+1,v.w);
}
memset(dis,0x3f,sizeof(dis));
DJ(0);
printf("%lld",dis[m*2+1]);
return 0;
}
差分优化建边(Tax)的更多相关文章
- 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序
题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...
- [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)
[Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...
- UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]
UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...
- [十二省联考2019]字符串问题——后缀自动机+parent树优化建图+拓扑序DP+倍增
题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的 ...
- [SDOI2017]天才黑客[最短路、前缀优化建图]
题意 一个 \(n\) 点 \(m\) 边的有向图,还有一棵 \(k\) 个节点的 trie ,每条边上有一个字符串,可以用 trie 的根到某个节点的路径来表示.每经过一条边,当前携带的字符串就会变 ...
- Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)
题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...
- BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan
Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...
- cf786E ALT (最小割+倍增优化建图)
如果把“我全都要”看作是我全不要的话,就可以用最小割解决啦 源点S,汇点T 我们试图让每个市民作为一个等待被割断的路径 把狗狗给市民:建边(S,i,1),其中i是市民 把狗狗给守卫:建边(j,T,1) ...
- 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra
[题目]#6354. 「CodePlus 2018 4 月赛」最短路 [题意]给定n个点,m条带权有向边,任意两个点i和j还可以花费(i xor j)*C到达(C是给定的常数),求A到B的最短距离.\ ...
随机推荐
- python-输入输出-计算字符串中的数
将字符串中的每个数都抽取出来,然后统计所有数的个数并求和. 输入格式: 一行字符串,字符串中的数之间用1个空格或者多个空格分隔. 输出格式: 第1行:输出数的个数.第2行:求和的结果,保留3位小数. ...
- hive启动出错
Hive启动报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument - 狗子的进阶史 - ...
- PAT B1076 Wifi密码
题目描述: 下面是微博上流传的一张照片:"各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B-2:C-3:D-4:请同 ...
- SpringMVC基于注解开发的步骤
基于xml配置 .1准备好以下相关jar包 .2创建Maven项目使用骨架 (这里选择第二个以webapp结尾的非第一个) 给项目起个名字 这里可以更改maven本地仓库(依赖包所存放的地方)的路径 ...
- 基于Apache Hudi和Debezium构建CDC入湖管道
从 Hudi v0.10.0 开始,我们很高兴地宣布推出适用于 Deltastreamer 的 Debezium 源,它提供从 Postgres 和 MySQL 数据库到数据湖的变更捕获数据 (CDC ...
- Dart语言基础
文章目录 前言:dart语言简介 一.变量 1.1.类型推导 1.2.默认值 1.3.Final 和 const修饰符 二.内建类型 2.1.数据类型 2.2.集合的相关操作 三.函数 3.1.函数的 ...
- 宝藏考研公众号,考研up篇(参考)
每当刷完题感觉到累了,看完网课觉得倦了,拿起手机看一下我推荐的宝藏公众号和up推送的文章和视频(。・ω・。)ノ♡,这样既可以换换口味解解腻,又可以不断的提升自己,岂不美哉?让别人以为你拿起手机开始摆烂 ...
- vim 下几种比较省劲的方式(vi结合着用)
Vim的几种模式 正常模式:可以使用快捷键命令,或按:输入命令行. 插入模式:可以输入文本,在正常模式下,按i.a.o等都可以进入插入模式. 可视模式:正常模式下按v可以进入可视模式, 在可视模式下, ...
- keytools命令生成证书
平时开发中可以使用keytools命令生成证书,一般常用格式为: keytool -genkey -alias tzzxxt -keyalg RSA -keypass 123456 -validity ...
- 帝国CMS模板$GLOBALS[navclassid]用法详解
帝国CMS模板程序扩展变量说明:通过这些变量可实现各种更复杂的显示格式. 一.列表/封面模板变量说明:(栏目页或专题页中使用) (一).当前栏目ID或专题ID:$GLOBALS[navclassid] ...