bzoj4398:福慧双修
学习了一下最短路的姿势,这个建图方法好妙啊,虽然不会证明正确性……
#include <bits/stdc++.h>
#define N 220000
#define INF 1000000000
using namespace std;
int n, m;
int ai[N], bi[N], ci[N], di[N];
int check;
class DIJ
{
private:
struct node {int t, d;};
struct comp {int operator () (node a, node b) {return a.d > b.d;}};
priority_queue <node, vector <node>, comp> Q;
public:
vector <int> bi[N], ci[N];
int dis[N], vis[N], pre[N];
int tot;
void build(int a, int b, int c)
{
bi[a].push_back(b); ci[a].push_back(c);
//if (check) printf("%d %d %d\n",a,b,c);
}
void solve()
{
for (int i = ; i <= tot; ++ i) dis[i] = INF, vis[i] = ;
dis[] = vis[] = ;
Q.push((node){, });
while (!Q.empty())
{
int hd;
do hd = Q.top().t, Q.pop();
while (vis[hd] && !Q.empty());
if (vis[hd]) break; else vis[hd] = ;
for (int j = ; j < bi[hd].size(); ++ j)
if (dis[hd] + ci[hd][j] < dis[bi[hd][j]])
{
dis[bi[hd][j]] = dis[hd] + ci[hd][j];
pre[bi[hd][j]] = hd == ? bi[hd][j]: pre[hd];
Q.push((node){bi[hd][j], dis[bi[hd][j]]});
}
}
}
} A, B;
int tot, ans = INF, bac = INF, pp;
int main()
{
scanf("%d%d", &n, &m); A.tot = n; B.tot = n + ;
for (int i = ; i <= m; ++ i)
{
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
tot ++; ai[tot] = a; bi[tot] = b; ci[tot] = c;
tot ++; ai[tot] = b; bi[tot] = a; ci[tot] = d;
A.build(a, b, c);
A.build(b, a, d);
if (a == || b == ) if (bac > c + d) bac = c + d, pp = (a == ? b: a);
}
A.solve();
A.dis[] = bac; A.pre[] = pp;
check = ;
for (int i = ; i <= tot; ++ i)
{
if (ai[i] == )
{
if (A.pre[bi[i]] != bi[i])
B.build(, bi[i], ci[i]);
}
else if (bi[i] == )
{
if (A.pre[ai[i]] != ai[i])
B.build(, n + , A.dis[ai[i]] + ci[i]);
else B.build(ai[i], n + , ci[i]);
}
else if (A.pre[ai[i]] != A.pre[bi[i]])
B.build(, bi[i], A.dis[ai[i]] + ci[i]);
else B.build(ai[i], bi[i], ci[i]);
}
B.solve();
printf("%d\n", B.dis[n + ]);
}
bzoj4398:福慧双修的更多相关文章
- 【技巧 二进制分组】bzoj4398: 福慧双修&&2407: 探险
二进制分组也可以说是一种比较优美的拆贡献方式吧? Description 菩萨为行,福慧双修,智人得果,不忘其本.——唐朠立<大慈恩寺三藏法师传>有才而知进退,福慧双修,这才难得.——乌雅 ...
- bzoj4398: 福慧双修
正边权无向图,一条边两个方向权值不一定相同,求经过点1的最小简单环 简单环包含了点1的一条出边和一条入边,且这两条边不同,因此可以枚举这两条边的编号的二进制表示中哪一位不同,用最短路求此时的最优解,时 ...
- [bzoj4398] 福慧双修 最短路 二进制分组
---题面--- 题解: 考场上看的这道题,,,当时70分算法打挂了,今天才知道这个也是原题.... 首先,对于不跟1相邻的边,肯定不会经过两次,因为经过两次就回来了,除了增加路径长度之外没有任何意义 ...
- [BZOJ4398]福慧双修/[BZOJ2407]探险
题目大意: 给定一个$n(n\leq40000)$个点$m(m\leq100000)$条边的有向图,求从$1$出发回到$1$的不经过重复结点的最短路. 思路: 首先Dijkstra求出从1出发到每个结 ...
- 【BZOJ4398】福慧双修(二进制,最短路)
题意: 此题中S=1 思路:Orz ManGod秒切此题 我觉得出入边权互换不太直观,就改了一下写法 第一次默认与1有关的第一条出边只出不入,第二次默认只入不出 ..]of longint; head ...
- 福慧双修&探险 BZOJ4398&BZOJ2407
分析: 双倍经验(数据范围不同). 我们考虑,我们必定是从1走一条边到节点i,之后从i到j跑最短路,之后再从j到1走另一条边的情况下,不会重复,并且是答案.那么我们考虑预处理出pre[i]表示从1走到 ...
- 【BZOJ4398】福慧双修 题解(建图优化)
题目链接 题目大意:给定一张$n$个点$m$条边的无向图,每条边两个方向的权值不一定相同.问从$1$出发不重复走一条边回到$1$的最短路径. ------------------- 暴力不太会.大概是 ...
- BZOJ_4398_福慧双修&&BZOJ_2407_探险_分治+dij
BZOJ_4398_福慧双修&&BZOJ_2407_探险_分治+dij Description 菩萨为行,福慧双修,智人得果,不忘其本. ——唐朠立<大慈恩寺三藏法师传> ...
- 题解 bzoj 4398福慧双修(二进制分组)
二进制分组,算个小技巧 bzoj 4398福慧双修 给一张图,同一条边不同方向权值不同,一条边只能走一次,求从1号点出发再回到1号点的最短路 一开始没注意一条边只能走一次这个限制,打了个从一号点相邻节 ...
随机推荐
- 文件上传之——用SWF插件实现文件异步上传和头像截取
之前写过几篇文件上传,那些都不错.今天小编带领大家体会一种新的上传方法,及使用Flash插件实现文件上传. 使用Flash的好处就是可以解决浏览器兼容性问题.之前我写的一个快捷复制功能也是利用的Fla ...
- Python版设计模式: 创建型模式:单例模式和工厂模式家族
一. 单例模式(Singleton) 所谓单例模式,也就是说不管什么时候都要确保只有一个对象实例存在.很多情况下,整个系统中只需要存在一个对象,所有的信息都从这个对象获取,比如系统的配置对象,或者是线 ...
- c风格字符串
1.字符数组截取 有当然有了,应均包含在<string.h>中. 有strncpy,strncat.可以帮你从任何位置,取得任意合法长度的字符串. 用法基本同strcpy,strcat. ...
- java-正则表达式过滤标签
String str="one <a href=u.php?action=show&uid=122113 target=_blank>超链接文本</a> tw ...
- 基于ArcGIS API for Javascript的地图编辑工具
最近工作上需要用ArcGIS API for Javascript来开发一个浏览器上使用的地图编辑工具,分享一下一些相关的开发经验. 我开发的地图编辑工具是根据ESRI提供的例子修改而来的,参考的例子 ...
- Android基础测试题(四)
看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...
- eclipse中启动调试maven构建的javaweb项目
RT,遇到这个问题,我的第一反应就是找教程,今天折腾了一天,书也看了,博客也看了,maven视频都看了,有种做不出来的感觉了,带着前几个小时看的相关的资料和经验,就自己去摸索了. 直接开始说我是怎么做 ...
- django的cookie和session以及内置信号、缓存
cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...
- UOJ59 WC2013 小Q运动季
题意:给一个模线性方程组,构造解满足尽量多的方程. 直接枚举. 模数两两互质,先排除无解的,然后CRT,然而要高精,上python. 直接高消,有完美解. 2^20暴搜. 分解模数,对每个质数高消,C ...
- opencv_判断两张图片是否相同
QQ:231469242 pip install opencv 如果找不到版本,去非官方下载opencv第三方包http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下 ...