题意:给定一张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. ListBox、ListCtrl

    设置编辑框滚动条在最新的位置 //CEdit* editBox=(CEdit*)GetDlgItem(IDC_EDIT_RECV); //(editBox->LineScroll(editBox ...

  2. 常用的Markdown语法

    1.表格 | 左对齐标题 | 右对齐标题 | 居中对齐标题 | | :------| ------: | :------: | | 短文本 | 中等文本 | 稍微长一点的文本 | | 稍微长一点的文本 ...

  3. AtomicLong和LongAdder的区别

    AtomicLong的原理是依靠底层的cas来保障原子性的更新数据,在要添加或者减少的时候,会使用死循环不断地cas到特定的值,从而达到更新数据的目的. LongAdder在AtomicLong的基础 ...

  4. ubuntu安装和分区方案

    方案引用 Swap(相当于电脑内存):逻辑分区.大小设置为电脑内存大小,2G,4G: /boot(引导分区):主分区:大小设置为480M: /home(用户存储数据用):逻辑分区,要尽可能大,100G ...

  5. tomcat quartz 被触发两次

    主要原因为tomcat server.xml 配置问题 <Host appBase="webapps" autoDeploy="true" name=&q ...

  6. tomcat线程一直处于RUNNABLE,不接受请求

    最近项目中一个模块出现一个问题,本人做的比较浅显,所以很简单的问题一直搞了好几天,通过各种查资料.工具终于分析除了问题.问题如下: 现在对tomcat一个工程(会通过httpurlconnection ...

  7. zookeeper安装教程

    zookeeper  一.单机安装 1.1 下载 1.2 安装 1.3 配置 1.4 启动和停止 二.伪集群模式 2.1 zookeeper1配置 2.2 zookeeper2配置 2.3 zooke ...

  8. yolo

     将目标检测过程设计为为一个回归问题(One Stage Detection),一步到位, 直接从像素到 bbox 坐标和类别概率 优点: 速度快(45fps),效果还不错(mAP 63.4) 利用 ...

  9. nginx反向代理转发后页面上的js css文件无法加载【原创】

    故障现象:nginx做代理转发后,发现页面上的js css文件无法加载,页面样式乱了. 原因:没有配置静态资源 解决js css文件无法加载无法访问的问题 解决办法: 修改配置文件nginx.conf ...

  10. mysql数据库 详解 之 自学成才1

    一.学习目录 1.认识数据库和mysql 2.mysql连接 3.入门语句 4.详解列类型 5.增删改查 INSERT INTO  表名(列1,……  列n)  VALUES(值 1,……  值 n) ...