CF131D Subway 题解
前置知识
解法
考虑用 Tarjan 进行缩点,然后跑最短路。
- 缩点:本题的缩点有些特殊,基于有向图缩点修改而得,因为是无向图,所以在 Tarjan 过程中要额外记录一下从何处转移过来,防止在同一处一直循环。
- 基环树上找环还有其他方法,详见 luogu P8655 [蓝桥杯 2017 国 B] 发现环,这里仅讲解使用 Tarjan 求解。
- 最短路:因为缩完点后就形成了一棵树,且因为是无向图,环外任意一点到环上最短距离等同于环上到环外任意一点最短距离,所以接着以环缩成的点为起点跑单源最短路或 DFS 或 LCA 求解即可。本篇题解使用 Dijkstra 算法求单源最短路。
- 用 LCA 有些杀鸡用牛刀了。
- luogu P2783 有机化学之神偶尔会做作弊 需要用到 LCA 求解。
- 用 LCA 有些杀鸡用牛刀了。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sort stable_sort
#define endl '\n'
struct node
{
int nxt,to,w;
}e[10000];
int head[10000],u[10000],v[10000],dfn[10000],low[10000],ins[10000],c[10000],dis[10000],vis[10000],cnt=0,tot=0,ans=0,scc=0,rt=0;
stack<int>s;
void add(int u,int v)
{
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
e[cnt].w=1;
head[u]=cnt;
}
void tarjan(int x,int fa)
{
int i,k=0;
tot++;
dfn[x]=low[x]=tot;
ins[x]=1;
s.push(x);
for(i=head[x];i!=0;i=e[i].nxt)
{
if(e[i].to!=fa)
{
if(dfn[e[i].to]==0)
{
tarjan(e[i].to,x);
low[x]=min(low[x],low[e[i].to]);
}
else
{
if(ins[e[i].to]==1)
{
low[x]=min(low[x],dfn[e[i].to]);
}
}
}
}
if(dfn[x]==low[x])
{
ans++;
scc=0;
while(x!=k)
{
k=s.top();
ins[k]=0;
c[k]=ans;
scc++;
s.pop();
}
if(scc>=2)
{
rt=ans;
}
}
}
void dijkstra(int s)
{
int x,i;
priority_queue<pair<int,int> >q;
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push(make_pair(0,-s));
while(q.empty()==0)
{
x=-q.top().second;
q.pop();
if(vis[x]==0)
{
vis[x]=1;
for(i=head[x];i!=0;i=e[i].nxt)
{
if(dis[e[i].to]>dis[x]+e[i].w)
{
dis[e[i].to]=dis[x]+e[i].w;
q.push(make_pair(-dis[e[i].to],-e[i].to));
}
}
}
}
}
int main()
{
int n,i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>u[i]>>v[i];
add(u[i],v[i]);
add(v[i],u[i]);
}
for(i=1;i<=n;i++)
{
if(dfn[i]==0)
{
tarjan(i,0);
}
}
cnt=0;
memset(e,0,sizeof(e));
memset(head,0,sizeof(head));
for(i=1;i<=n;i++)
{
if(c[u[i]]!=c[v[i]])
{
add(c[u[i]],c[v[i]]);
add(c[v[i]],c[u[i]]);
}
}
dijkstra(rt);
for(i=1;i<=n;i++)
{
cout<<dis[c[i]]<<" ";
}
return 0;
}
后记
推销一下自己的 Tarjan 学习笔记 。
CF131D Subway 题解的更多相关文章
- 【CF131D】Subway
题目大意:给定一棵 N 个节点的基环树,求各个点到环的最小距离. 题解:除了找环的必须参数之外,对每个点维护一个 fa 即可. 代码如下 #include <bits/stdc++.h> ...
- 2016 Multi-University Training Contest 1 J.Subway
Subway Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Su ...
- 【POJ】【1635】Subway Tree Systems
树的最小表示法 给定两个有根树的dfs序,问这两棵树是否同构 题解:http://blog.sina.com.cn/s/blog_a4c6b95201017tlz.html 题目要求判断两棵树是否是同 ...
- POJ 2502 Subway (最短路)
Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ...
- buaacoding_2018算法期末上机G题.地铁建设题解
// 标注:本文旨在为博主确立一种题解的基本范式,以避免博主的题解流于AC代码的粘贴.此基本范式为:完整而简洁明了的思路及其推导说明,力图触及问题的本质并衍生对同类问题的思路分析,使得题解具有泛用性, ...
- Subway Pursuit (二分)(交互题)
题目来源:codeforces1039B Subway Pursuit 题目大意: 在1到n里有一个运动的点,要求找到这个点,每次可以查询一个区间内有没有这个点,每次这个点往左或者往右移动1到k个位置 ...
- POJ2502:Subway(最短路)
Subway Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14634 Accepted: 4718 题目链接:http ...
- kuangbin带你飞 最短路 题解
求一个图最短路边的办法.好像下面的那个有问题.单向边和双向边一定是有区别的.这个比较容易.参照该文的最短路网络流题目和连通图题目一题求最短路关节边 另外上述2个题目的代码好像有问题. 在UVALIVE ...
- Codeforces Beta Round #95 (Div. 2) D. Subway 边双联通+spfa
D. Subway A subway scheme, classic for all Berland cities is represented by a set of n stations co ...
- L - Subway(最短路spfa)
L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...
随机推荐
- zookeeper 节点介绍及节点常用命令总结
本文为博主原创,未经允许不得转载: 目录: 1. znode 节点特性 2. zookeeper 的四种节点类型及适用场景分析 3. zookeeper 客户端常用操作命令 4. znode 数据增删 ...
- spring--是如何解决单例模式下循环依赖问题的
Spring 解决单例 bean 的循环依赖主要依赖于容器的三级缓存机制,以及 bean 的提前暴露.这里是它如何工作的: 三级缓存: 一级缓存(singletonObjects):存储已经经过完整生 ...
- [转帖]【终端使用】"usermod"命令 和 组(包括:主组、附加组)
"usermod"命令,可以用来设置用户账户的 主组.附加组.登录使用的Shell. 命令 作用 usermod -g 组名 用户名 修改用户的主组(gid) usermod ...
- Oracle 核心列信息查看与处理
Oracle 核心列信息查看与处理 背景 最近想对数据库表进行跨数据之间的比照 因为有一些自增列或者是时间戳的列不需要进行对比 后者是对比容易导致失真. 所以就准备选用其他方式进行一下处理. 本文主要 ...
- [转贴]英特尔Sapphire Rapids至强可扩展CPU完整型号爆料与路线图展望
2022-10-13 15:15· 稿源: cnbeta 腾讯云服务器促销:2核2G首年仅需40元 历史新低 @结城安穗-YuuKi_AnS 刚刚在社交媒体上,分享了与英特尔下一代 Sapph ...
- RC4加密技术探究:优缺点与实战应用
引言 在网络安全领域,加密技术一直是保障数据安全的重要手段.Rivest Cipher 4(简称RC4)作为一种对称加密算法,自20世纪80年代以来广泛应用于各种网络安全协议中.本文将详细分析RC4加 ...
- 新建立git分支,之后将分支合并到master上
1.打开PowerShell 进入解决方案中的文件夹中,并列出目前远程的所有分支 命令:git branch -a 2.从远程获取最新版本到本地 命令:git fetch --all 3.使本地代码与 ...
- 【云原生】为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?
前言 如标题中的问题所提到的虚拟化,容器,Docker和K8s那样,我们不妨这样问:这些技术到底适用于哪些场景,有没有别的技术可以替代?这些技术的优劣在哪里? 下面我将针对性地从以上几个问题的出发点, ...
- 领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统
领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统 本项目主要实现了疾病自诊和医生推荐两个功能并构建了医生服务指标评价体系.疾病自诊主要通 ...
- 深度学习基础入门篇[六]:模型调优,学习率设置(Warm Up、loss自适应衰减等),batch size调优技巧,基于方差放缩初始化方法。
深度学习基础入门篇[六]:模型调优,学习率设置(Warm Up.loss自适应衰减等),batch size调优技巧,基于方差放缩初始化方法. 1.学习率 学习率是训练神经网络的重要超参数之一,它代表 ...