题意:给定一张n个点,m条边的无向联通图,其中m-n<=20,共q次询问,每次询问求给定两点u,v间的最短路长度

第一眼看见这题的时候,以为有什么神奇的全图最短路算法,满心欢喜的去翻了题解,发现就四个字“树上套环”!

其实这题的提示很明显:m-n<=20!

这说明,如果我们对这个图做一次生成树,那么非树边最多只会有20条!

那么,我们在求任意两点间最短路时,可以分类讨论进行:

①:如果这两点间的最短路只经过树边,那么我们可以直接在树上预处理,利用lca(树上两点距离公式)

②:如果这两点间的最短路会经过非树边,那么由于非树边只有20条,所以产生非树边的点最多只有40个,那这样的话我们可以枚举所有有非树边的点,对全图求最短路,然后在每次询问时枚举每个有非树边的点,每找出一个有非树边的点就去求一遍最短路,最后对找出的所有结果求出最小值即可。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
struct Edge
{
int next;
int to;
ll val;
}edge[];
bool used[];
int num[];
ll dis[][];
int que[];
struct node
{
int lx,rx;
}e[];
struct tt
{
int p;
ll v;
};
bool operator < (tt a,tt b)
{
return a.v>b.v;
}
int head[];
bool vis[];
int deep[];
int cnt=;
int n,m;
void init()
{
memset(head,-,sizeof(head));
memset(dis,0x3f,sizeof(dis));
cnt=;
}
void add(int l,int r,ll w)
{
edge[cnt].next=head[l];
edge[cnt].to=r;
edge[cnt].val=w;
head[l]=cnt++;
}
ll dep[];
int f[][];
void dfs(int x,int fx)
{
deep[x]=deep[fx]+;
f[x][]=fx;
for(int i=head[x];i!=-;i=edge[i].next)
{
int to=edge[i].to;
if(to==fx)
{
continue;
}
if(f[to][])
{
continue;
}
dep[to]=dep[x]+edge[i].val;
dfs(to,x);
}
}
void getf()
{
for(int i=;i<=;i++)
{
for(int j=;j<=n;j++)
{
f[j][i]=f[f[j][i-]][i-];
}
}
}
inline int read()
{
int f=,x=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void diji(int rt,int typ)
{
memset(vis,,sizeof(vis));
dis[rt][typ]=;
priority_queue <tt> M;
tt s;
s.p=rt;
s.v=;
M.push(s);
while(!M.empty())
{
tt uu=M.top();
M.pop();
int u=uu.p;
if(vis[u])
{
continue;
}
vis[u]=;
for(int i=head[u];i!=-;i=edge[i].next)
{
int to=edge[i].to;
if(vis[to])
{
continue;
}
if(dis[to][typ]>dis[u][typ]+edge[i].val)
{
dis[to][typ]=dis[u][typ]+edge[i].val;
tt temp;
temp.p=to;
temp.v=dis[to][typ];
M.push(temp);
}
}
}
}
int LCA(int x,int y)
{
if(deep[x]>deep[y])
{
swap(x,y);
}
for(int i=;i>=;i--)
{
if(deep[f[y][i]]>=deep[x])
{
y=f[y][i];
}
}
if(x==y)
{
return x;
}
int ret;
for(int i=;i>=;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}else
{
ret=f[x][i];
}
}
return ret;
}
int main()
{
n=read(),m=read();
init();
for(int i=;i<=m;i++)
{
int x=read(),y=read(),z=read();
add(x,y,(ll)z);
add(y,x,(ll)z);
e[i].lx=x;
e[i].rx=y;
}
dfs(,);
getf();
for(int i=;i<=m;i++)
{
if(f[e[i].lx][]!=e[i].rx&&f[e[i].rx][]!=e[i].lx)
{
used[e[i].lx]=;
used[e[i].rx]=;
}
}
int cct=;
for(int i=;i<=n;i++)
{
if(used[i])
{
que[++cct]=i;;
diji(i,cct);
}
}
int q=read();
for(int i=;i<=q;i++)
{
int x=read(),y=read();
int f1=LCA(x,y);
ll ret=dep[x]+dep[y]-*dep[f1];
for(int j=;j<=cct;j++)
{
ret=min(ret,dis[x][j]+dis[y][j]);
}
printf("%lld\n",ret);
}
return ;
}

CF 1051F的更多相关文章

  1. cf 1051F 树+图

    $des$给定一张 $n$ 个点 $m$ 条边的带权无向联通图,$q$ 次询问,每次询问 $u_i$ 到 $v_i$ 的最短路长度.$n,q <= 10^5, m - n <= 20$ $ ...

  2. Codeforces 1051E Vasya and Big Integers&1051F The Shortest Statement

    1051E. Vasya and Big Integers 题意 给出三个大整数\(a,l,r\),定义\(a\)的一种合法的拆分为把\(a\)表示成若干个字符串首位相连,且每个字符串的大小在\(l, ...

  3. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  6. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  7. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  8. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  9. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

随机推荐

  1. Thymeleaf引入公共片段方式

    引入公共片段 引入公共片段的th属性,包括三种方式 th:insert 将公共片段,整个插入到声明引入的元素中 th:replace 将声明引入的元素,替换为公共片段 th:include 将被引入的 ...

  2. css3 特效拓展 画个安卓机器人

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Java的Fork/Join任务

    当我们需要执行大量的小任务时,有经验的Java开发人员都会采用线程池来高效执行这些小任务.然而,有一种任务,例如,对超过1000万个元素的数组进行排序,这种任务本身可以并发执行,但如何拆解成小任务需要 ...

  4. [转] 深入理解Batch Normalization批标准化

    转自:https://www.cnblogs.com/guoyaohua/p/8724433.html 郭耀华's Blog 欲穷千里目,更上一层楼项目主页:https://github.com/gu ...

  5. SQL Server - SQL语言组成 (DML、DDL、DCL、DQL的区别)

    转载自:https://www.cnblogs.com/dato/p/7049343.html 作者:Dato.zeng --------------------------------------- ...

  6. .net中的设计模式---单例模式

    .net设计模式: Net设计模式实例之单例模式( Singleton Pattern)  一 : 单例模式的简介:(Brief Introduction) 单例模式(Singleton Patter ...

  7. date命令以及date -d使用

    date -d '2 days ago' //显示2天前的时间,2019年 02月 10日 星期日 08:53:28 CST date -d "2 days ago" +%Y%m% ...

  8. FAT32文件格式示例解析

    1.前言 本文主要以一个示例来分析FAT32文件系统的格式,对FAT32文件系统的各个区域详细分析. 2.FAT32文件系统典型分区 3.FAT32文件系统示例 按如下步骤在ubuntu下创建FAT3 ...

  9. MySQL如何启用密码强度审计【转】

    1.密码验证插件安装 要使服务器可以使用,插件库文件必须位于MySQL插件目录(plugin_dir系统变量指定的目录)中.如有必要,请设置plugin_dir服务器启动时的值, 以告知服务器插件目录 ...

  10. Markdown中Latex 数学公式基本语法

    原文地址:http://blog.csdn.net/u014630987/article/details/70156489 Markdown中Latex 数学公式基本语法 公式排版 分为两种排版: - ...