题目链接

题目大意:给定一张$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】福慧双修 题解(建图优化)的更多相关文章

  1. 『The Captain 最短路建图优化』

    The Captain(BZOJ 4152) Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小 ...

  2. BZOJ4383/LuoGuP3588 Pustynia/PUS 线段树建图优化

    我会告诉你我看了很久很久才把题目看懂吗???怀疑智商了 原来他给的l,r还有k个数字都是下标... 比如给了一个样例 l, r, k, x1,x2,x3...xk,代表的是一个数组num[l]~num ...

  3. BZOJ4205卡牌配对——最大流+建图优化

    题目描述 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不 ...

  4. 2018.08.29 NOIP模拟 table(拓扑排序+建图优化)

    [描述] 给出一个表格,N 行 M 列,每个格子有一个整数,有些格子是空的.现在需要你 来做出一些调整,使得每行都是非降序的.这个调整只能是整列的移动. [输入] 第一行两个正整数 N 和 M. 接下 ...

  5. [Code+#4] 最短路 - 建图优化,最短路

    最短路问题,然而对于任意\(i,j\),从\(i\)到\(j\)可以只花费\((i xor j) \cdot C\) 对每个点\(i\),只考虑到\(j\)满足\(j=i xor 2^k, j \le ...

  6. [HNOI2019]校园旅行(建图优化+bfs)

    30分的O(m^2)做法应该比较容易想到:令f[i][j]表示i->j是否有解,然后把每个路径点数不超过2的有解状态(u,v)加入队列,然后弹出队列时,两点分别向两边搜索边,发现颜色一样时,再修 ...

  7. CodeForces 786B Legacy(线段树优化建图+最短路)

    [题目链接] http://codeforces.com/problemset/problem/786/B [题目大意] 给出一些星球,现在有一些传送枪,可以从一个星球到另一个星球, 从一个星球到另一 ...

  8. [bzoj3218] a+b problem [最小割+数据结构优化建图]

    题面 传送门 思路 最小割 我们首先忽略掉那个奇♂怪的限制,就有一个比较显然的最小割模型: 建立源点$S$和汇点$T$ 对于每个元素$i$建立一个点$i$,连边$<S,i,w[i]>$和$ ...

  9. Codeforces 587D - Duff in Mafia(2-SAT+前后缀优化建图)

    Codeforces 题面传送门 & 洛谷题面传送门 2-SAT hot tea. 首先一眼二分答案,我们二分答案 \(mid\),那么问题转化为,是否存在一个所有边权都 \(\le mid\ ...

随机推荐

  1. windows下的包管理器scoop

    scoop(传送门) 安装 scoop是一个类似于linux下apt之类包管理器 安装scoop(Powershell 3+  and .NET Framework 4.5+) iex (new-ob ...

  2. 【Python】关于如何判断一个list是否为空的思考

    前言 今天随手翻 stackoverflow,看到问题叫 How do I check if a list is empty? 一看这个问题,不难猜到到这是一个刚学 Python 的人提问的,因为这个 ...

  3. JavaScript图形实例:阿基米德螺线

    1.阿基米德螺线 阿基米德螺线亦称“等速螺线”.当一点P沿动射线OP以等速率运动的同时,该射线又以等角速度绕点O旋转,点P的轨迹称为“阿基米德螺线”. 阿基米德螺线的笛卡尔坐标方程式为: r=10*( ...

  4. mysql groupby 字段合并问题(group_concat)

    在我们的日常mysql查询中,我们可能会遇到这样的情况: 对表中的所有记录进行分类,并且我需要得到每个分类中某个字段的全部成员. 上面的话,大家看起来可能不太好懂,下面举一个例子来给大家说明. 现在我 ...

  5. Java应用服务器之tomcat基础配置(一)

    前文我们聊到了java相关重要组件和它们之间的关系以及jdk.tomcat部署回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13302938.html:今天我们 ...

  6. Redis之对象

    1.对象的类型与编码 Redis使用对象来表示数据库中的键和值,每次我们在Redis的数据库中新创建一个键值对,我们至少会创建两个对象,一个键对象,另一个值对象. 每个对象都由一个redisObjec ...

  7. 学会Markdown不仅可以用来编写文档,还可以制作自己的简历,真香!

    程序员的简历要简洁明了,不要太多花哨的修饰,突出重点即可,使用markdown就可以很好的满足写一份简历的需求 Markdown 简历模板 这里我贡献一下我自己的markdown简历模板,简历效果如下 ...

  8. ​​​​​​​爆力破解Windows操作系统登录密码核心技术

    一.不借助U盘等工具二.已将win7登录账户为test,密码为666666,全套C/C++黑客资料请加:726920220QQ 1.将电脑开机关机几次,进入以下界面

  9. 【Python学习笔记三】一个简单的python爬虫

    这里写爬虫用的requests插件 1.一般那3.x版本的python安装后都带有相应的安装文件,目录在python安装目录的Scripts中,如下:   2.将scripts的目录配置到环境变量pa ...

  10. vs coed的使用(二) 如何运行cpp文件(不用插件比如code runner)

    一.前提 1.配置好编译运行的环境,比如系统变量.vs code的settings.json 2.检查配置好的环境没有问题 我配置结果 [环境变量] [系统变量] 确定settings.json里面的 ...