【BZOJ4398】福慧双修 题解(建图优化)
题目大意:给定一张$n$个点$m$条边的无向图,每条边两个方向的权值不一定相同。问从$1$出发不重复走一条边回到$1$的最短路径。
-------------------
暴力不太会。大概是$dfs$?复杂度不得上天……
正解:对于那些端点不是$1$的边,因为要走最短路,所以这些边只会走一次,所以对答案是没有影响的。考虑端点为$1$的边,我们进行“二进制分组”。每次按照二进制分为两组:入边和出边,然后跑最短路。路径长为$dis[edge[i].to]$加上入边权值。这样做能把所有情况包括进去,符合最优性质。
时间复杂度$O(n\log^2 n)$。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,vis[],dis[],tag[],ans=0x3f3f3f3f;
int head[],cnt=-;
struct edge
{
int next,to,dis;
}edge[];
struct node
{
int dis,pos;
bool operator < (const node &x) const
{
return x.dis<dis;
}
};
priority_queue<node> q;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void add(int from,int to,int dis)
{
edge[++cnt].next=head[from];
edge[cnt].to=to;
edge[cnt].dis=dis;
head[from]=cnt;
}
inline void dijkstra()
{
for(int i=;i<=n;i++) dis[i]=0x3f3f3f3f;
memset(vis,,sizeof(vis));
dis[]=;q.push((node){,});
while(!q.empty())
{
node tmp=q.top();q.pop();
int now=tmp.pos;
if (vis[now]) continue;
vis[now]=;
for (int i=head[now];i!=-;i=edge[i].next)
{
if (tag[i]==-) continue;
int to=edge[i].to;
if (dis[to]>dis[now]+edge[i].dis)
{
dis[to]=dis[now]+edge[i].dis;
if (!vis[to]) q.push((node){dis[to],to});
}
}
}
for (int i=head[];i!=-;i=edge[i].next)
if (tag[i]==-&&ans>dis[edge[i].to]+edge[i^].dis)
ans=dis[edge[i].to]+edge[i^].dis;
}
signed main()
{
n=read(),m=read();
memset(head,-,sizeof(head));
for (int i=;i<=m;i++)
{
int u=read(),v=read(),w1=read(),w2=read();
add(u,v,w1);add(v,u,w2);
}
for (int d=;d>=;d--)
{
for (int i=head[];i!=-;i=edge[i].next)
if((i>>d)&) tag[i]=,tag[i^]=-;
else tag[i]=-,tag[i^]=;
dijkstra();
for (int i=head[];i!=-;i=edge[i].next)
if ((i>>d)&) tag[i]=-,tag[i^]=;
else tag[i]=,tag[i^]=-;
dijkstra();
}
printf("%lld",(ans==0x3f3f3f3f)?-:ans);
return ;
}
【BZOJ4398】福慧双修 题解(建图优化)的更多相关文章
- 『The Captain 最短路建图优化』
The Captain(BZOJ 4152) Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小 ...
- BZOJ4383/LuoGuP3588 Pustynia/PUS 线段树建图优化
我会告诉你我看了很久很久才把题目看懂吗???怀疑智商了 原来他给的l,r还有k个数字都是下标... 比如给了一个样例 l, r, k, x1,x2,x3...xk,代表的是一个数组num[l]~num ...
- BZOJ4205卡牌配对——最大流+建图优化
题目描述 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不 ...
- 2018.08.29 NOIP模拟 table(拓扑排序+建图优化)
[描述] 给出一个表格,N 行 M 列,每个格子有一个整数,有些格子是空的.现在需要你 来做出一些调整,使得每行都是非降序的.这个调整只能是整列的移动. [输入] 第一行两个正整数 N 和 M. 接下 ...
- [Code+#4] 最短路 - 建图优化,最短路
最短路问题,然而对于任意\(i,j\),从\(i\)到\(j\)可以只花费\((i xor j) \cdot C\) 对每个点\(i\),只考虑到\(j\)满足\(j=i xor 2^k, j \le ...
- [HNOI2019]校园旅行(建图优化+bfs)
30分的O(m^2)做法应该比较容易想到:令f[i][j]表示i->j是否有解,然后把每个路径点数不超过2的有解状态(u,v)加入队列,然后弹出队列时,两点分别向两边搜索边,发现颜色一样时,再修 ...
- CodeForces 786B Legacy(线段树优化建图+最短路)
[题目链接] http://codeforces.com/problemset/problem/786/B [题目大意] 给出一些星球,现在有一些传送枪,可以从一个星球到另一个星球, 从一个星球到另一 ...
- [bzoj3218] a+b problem [最小割+数据结构优化建图]
题面 传送门 思路 最小割 我们首先忽略掉那个奇♂怪的限制,就有一个比较显然的最小割模型: 建立源点$S$和汇点$T$ 对于每个元素$i$建立一个点$i$,连边$<S,i,w[i]>$和$ ...
- Codeforces 587D - Duff in Mafia(2-SAT+前后缀优化建图)
Codeforces 题面传送门 & 洛谷题面传送门 2-SAT hot tea. 首先一眼二分答案,我们二分答案 \(mid\),那么问题转化为,是否存在一个所有边权都 \(\le mid\ ...
随机推荐
- scala 数据结构(四):列表 List
1 列表 List-创建List 基本介绍 Scala中的List 和Java List 不一样,在Java中List是一个接口,真正存放数据是ArrayList,而Scala的List可以直接存放数 ...
- Scala 基础(三):Scala语言快速开发入门
1.Scala执行流程分析 2.Scala程序开发注意事项(重点) Scala源文件以 “.scala" 为扩展名. Scala程序的执行入口是main()函数. Scala语言严格区分大小 ...
- python数据处理(二)之处理Excel文件
代码与资料 https://github.com/jackiekazil/data-wrangling 1.安装相关包 2.解析Excel文件 在解析Excel之前应该想办法寻找替代的格式 3.开始解 ...
- 数据可视化之powerBI技巧(五)在Power BI中写出优雅的度量值是什么体验?
之前的文章(采悟:连接表的几个DAX函数,一次全掌握)介绍了产品A的客户与产品B的客户的各种交叉关系,其中最常用的应该是找出A和B的共同客户,以便进行产品关联分析. 之前的思路是计算出两个产品的共同客 ...
- Django框架12 /同源、跨域、CORS
Django框架12 /同源.跨域.CORS 目录 Django框架12 /同源.跨域.CORS 1. 同源策略 2. 跨域 3. 解决跨域:CORS/跨域资源共享 1. 同源策略 同源策略(Same ...
- TortoiseGit 解决冲突的两种方法
一.冲突发生原因: 用户A 有新提交 用户B 没有pull, 写新代码 ,pull , 提示有冲突 Solution: 1: stash save(把自己的代码隐藏存起来) -> 重新pul ...
- 从连接器组件看Tomcat的线程模型——连接器简介
Connector组件介绍 Connector(连接器)组件是Tomcat最核心的两个组件之一,主要的职责是负责接收客户端连接和客户端请求的处理加工.每个Connector都将指定一个端口进行监听,分 ...
- proxy是什么
普通的因特网访问是一个典型的客户机与服务器结构:用户利用计算机上的客户端程序,如浏览器发出请求,远端WWW服务器程序响应请求并提供相应的数据.而Proxy处于客户机与服务器之间,对于服务器来说,Pro ...
- IDEA 2020.1 查看内存使用情况
- Markdown 教程之编辑器
1. Typora 编辑器 Typora 是一款支持实时预览的 Markdown 文本编辑器.它有 OS X.Windows.Linux 三个平台的版本,并且由于仍在测试中,是完全免费的. 2. 安装 ...