2016弱校联盟十一专场10.2——Floyd-Warshall
题目链接:Floyd-Warshall
题意:
给你n个点,m条边,100>m-n>0,现在有q个询问,问你任意两点的最短距离,题目保证每条边都被连接,每条边的距离为1
题解:
首先我们可以看到边最多只比点多100个,那么我们可以先将n-1条边生成一棵树,然后用LCA来求最短距离。
然而有可能最短路在多余的这100条边上,所以我们将这100条边的两个端点到所有点的最短路用bfs预处理出来,
然后再用来更新一下答案就行。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define F(i,a,b) for(int i=a;i<=b;i++)
#define mst(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef pair<int,int>P; const int N=1e5+,DEG=;
int g[N],v[N*],nxt[N*],ed,n,m,q,eed,cnt,id[N],Q[N];
int dep[N],fa[N][DEG],dfn[N],idx,d[][N];
P vec[N];
bool vis[N]; inline void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}
inline void up(int &a,int b){if(a>b)a=b;} void dfs(int u=,int pre=)
{
dep[u]=dep[pre]+,fa[u][]=pre,dfn[u]=++idx;
F(i,,DEG-)fa[u][i]=fa[fa[u][i-]][i-];
for(int i=g[u];i;i=nxt[i])if(!dfn[v[i]])dfs(v[i],u);
else if(v[i]!=pre&&dfn[v[i]]<dfn[u])vec[++eed]=P(u,v[i]);
} int LCA(int a,int b){
if(dep[a]>dep[b])a^=b,b^=a,a^=b;
if(dep[a]<dep[b])F(i,,DEG-)if((dep[b]-dep[a])&(<<i))b=fa[b][i];
if(a!=b)for(int i=DEG-;i<?a=fa[a][]:,i>=;i--)
if(fa[a][i]!=fa[b][i])a=fa[a][i],b=fa[b][i];
return a;
} void bfs(int *d,int S)
{
mst(vis,);
int head=,tail=,now;
Q[++tail]=S,vis[S]=,d[S]=;
while(head<=tail)for(int i=g[now=Q[head++]];i;i=nxt[i])
if(!vis[v[i]])vis[v[i]]=,d[v[i]]=d[now]+,Q[++tail]=v[i];
} int main()
{
while(~scanf("%d%d%d",&n,&m,&q))
{
int x,y;ed=idx=eed=cnt=;
mst(g,),mst(dfn,),mst(fa,),mst(id,);
F(i,,m)scanf("%d%d",&x,&y),adg(x,y),adg(y,x);
dfs();
F(i,,eed)
{
if(!id[vec[i].first])id[vec[i].first]=++cnt,bfs(d[cnt],vec[i].first);
if(!id[vec[i].second])id[vec[i].second]=++cnt,bfs(d[cnt],vec[i].second);
}
F(i,,q)
{
scanf("%d%d",&x,&y);
int ans=dep[x]+dep[y]-*dep[LCA(x,y)];
F(j,,eed)
{
int u=id[vec[j].first],v=id[vec[j].second];
up(ans,d[u][x]+d[v][y]+),up(ans,d[v][x]+d[u][y]+);
}
printf("%d\n",ans);
}
}
return ;
}
2016弱校联盟十一专场10.2——Floyd-Warshall的更多相关文章
- 2016弱校联盟十一专场10.5---As Easy As Possible(倍增)
题目链接 https://acm.bnu.edu.cn/v3/contest_show.php?cid=8506#problem/A problem description As we know, t ...
- 2016弱校联盟十一专场10.3---Similarity of Subtrees(深搜+hash、映射)
题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52310 problem description Define the depth of a ...
- (2016弱校联盟十一专场10.3) D Parentheses
题目链接 把左括号看成A右括号看成B,推一下就行了.好久之前写的,推到最后发现是一个有规律的序列. #include <bits/stdc++.h> using namespace std ...
- (2016弱校联盟十一专场10.3) B.Help the Princess!
题目链接 宽搜一下就行. #include <iostream> #include<cstdio> #include<cstring> #include<qu ...
- (2016弱校联盟十一专场10.3) A.Best Matched Pair
题目链接 #include<cstdio> #include<cstring> #include<algorithm> #include<stack> ...
- 2016弱校联盟十一专场10.3---We don't wanna work!(STL--set的使用)
题目链接 https://acm.bnu.edu.cn/v3/contest_show.php?cid=8504#problem/C 代码如下: #include <iostream> # ...
- 2016弱校联盟十一专场10.2---Around the World(深搜+组合数、逆元)
题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52305 problem description In ICPCCamp, there ar ...
- (2016弱校联盟十一专场10.2) A.Nearest Neighbor Search
题目链接 水题,算一下就行. #include <bits/stdc++.h> using namespace std; typedef long long ll; ll x[],y[], ...
- (2016弱校联盟十一专场10.2) E.Coins
题目链接 很久之前写的了,好像是对拍打表过的,推一下就行了. #include <bits/stdc++.h> using namespace std; typedef long long ...
- (2016弱校联盟十一专场10.5) F. Fibonacci of Fibonacci
题目链接 题目大意就是这个,先找出下标的循环节,再快速幂对20160519取余就行了. 找出下标循环节: #include <cstdio> #include <iostream&g ...
随机推荐
- mongodb tip-2
1.or 查询的格式: var condition = {$or:[{field:1},{field:2}]} 2.字符串存储日期也可以用$gt $gte $lt $lte 直接比较 var cond ...
- JAVA上连接ubuntu14.04上的Hbase
对于新手来说,连接虚拟机上的Hbase有点繁琐,而且网上的配置不太适合初学者,今天我就整理了一下,希望对你们有帮助,第一次发博客. 1.首先去官网下载Hbase的压缩包.我这里用的是1.2.1 htt ...
- html5的navigator调用手机震动
navigator.vibrate(s) 或 navigator.webkitVibrate(s),不过该属性只在安卓系统有效.
- (转载)js 快捷键大全,并有简单使用说明
摘要: (转载)原文链接: http://www.cnblogs.com/fire-phoenix/archive/2010/09/28/1837295.html Code highlighting ...
- 认识css
(一)认识css: CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小.颜色.字体加粗等. ...
- uoj 55 紫荆花之恋 动态点分治+替罪羊式重构+treap
每插入一个点,直接把它当做重心插入原树,当做是动态点分树一样维护 但这样深度会越来越大,所以我们用类似替罪羊的方法 当树失去平衡时,对子树进行一次点分,保证复杂度 #include <cstdi ...
- java 生成二维码
package com.sun.erwei; import java.awt.Graphics2D;import java.awt.geom.AffineTransform;import java.a ...
- python的web开发环境Django配置
我的系统的windows10: 第一步,安装python3.5 第二步,配置django,如图所示,在python的安装目录下的Scripts里面执行:pip install Django,我这儿提示 ...
- NFV FD.io VPP VM 系统性能调优
Host Setting: 1.关闭power savings mode在BIOS中 2.设置 /sys/devices/system/cpu/cpu*/cpufreq/scaling_governo ...
- 关于最新版本的log4net使用中遇到的问题
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...