题目传送门

前置知识

强连通分量 | 最短路

解法

考虑用 Tarjan 进行缩点,然后跑最短路。

  • 缩点:本题的缩点有些特殊,基于有向图缩点修改而得,因为是无向图,所以在 Tarjan 过程中要额外记录一下从何处转移过来,防止在同一处一直循环。

  • 最短路:因为缩完点后就形成了一棵树,且因为是无向图,环外任意一点到环上最短距离等同于环上到环外任意一点最短距离,所以接着以环缩成的点为起点跑单源最短路或 DFS 或 LCA 求解即可。本篇题解使用 Dijkstra 算法求单源最短路。

代码

#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 题解的更多相关文章

  1. 【CF131D】Subway

    题目大意:给定一棵 N 个节点的基环树,求各个点到环的最小距离. 题解:除了找环的必须参数之外,对每个点维护一个 fa 即可. 代码如下 #include <bits/stdc++.h> ...

  2. 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 ...

  3. 【POJ】【1635】Subway Tree Systems

    树的最小表示法 给定两个有根树的dfs序,问这两棵树是否同构 题解:http://blog.sina.com.cn/s/blog_a4c6b95201017tlz.html 题目要求判断两棵树是否是同 ...

  4. POJ 2502 Subway (最短路)

    Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ...

  5. buaacoding_2018算法期末上机G题.地铁建设题解

    // 标注:本文旨在为博主确立一种题解的基本范式,以避免博主的题解流于AC代码的粘贴.此基本范式为:完整而简洁明了的思路及其推导说明,力图触及问题的本质并衍生对同类问题的思路分析,使得题解具有泛用性, ...

  6. Subway Pursuit (二分)(交互题)

    题目来源:codeforces1039B Subway Pursuit 题目大意: 在1到n里有一个运动的点,要求找到这个点,每次可以查询一个区间内有没有这个点,每次这个点往左或者往右移动1到k个位置 ...

  7. POJ2502:Subway(最短路)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14634   Accepted: 4718 题目链接:http ...

  8. kuangbin带你飞 最短路 题解

    求一个图最短路边的办法.好像下面的那个有问题.单向边和双向边一定是有区别的.这个比较容易.参照该文的最短路网络流题目和连通图题目一题求最短路关节边 另外上述2个题目的代码好像有问题. 在UVALIVE ...

  9. 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 ...

  10. L - Subway(最短路spfa)

    L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...

随机推荐

  1. java进阶(5)--package与import

    一.package 1.package的作用:为了方便程序的管理 2.package怎么使用:package+包名,只能出现在java代码的第一行 3.package命令规范:一般采用公司域名倒序方式 ...

  2. Vue之将前端的筛选结果导出为csv文件

    有导入就有导出哈!这里继导入之后记录一下导出的实现过程. 1.按钮部分: <el-button class="filter-item" style="margin- ...

  3. Laravel - blade 模板继承的使用

    1. 模板文件 <!DOCTYPE html> <html lang="en"> <head>     <meta charset=&qu ...

  4. 英语学习 : Get + 形容词 ( 表示由无到有的变化过程 )

    I am happy .    表示事实 I got happy .    强调变化过程 get + 名词  :  得到 ...物或人 get + 形容词  :  变得 ...样

  5. SpringBoot3集成Zookeeper

    标签:Zookeeper3.8 ,Curator5.5: 一.简介 ZooKeeper是一个集中的服务,用于维护配置信息.命名.提供分布式同步.提供组服务.分布式应用程序以某种形式使用所有这些类型的服 ...

  6. [转帖]Linux内存管理(一)——从硬件角度看内存管理

    从硬件角度看内存管理 ①.在操作系统还没有出来之前,程序都是被存放在卡片上,计算机读取一张卡片就运行一条指令.这种从外部存储介质上直接运行指令的方法效率很低 ②.单道编程的内存管理 所谓单道,就是整个 ...

  7. [转帖]Shell三剑客之sed

    目录 Shell三剑客 sed工具 sed 流编辑器的工作过程 sed命令格式与选项操作符 sed命令的常用选项 sed命令的打印功能 默认打印方式 sed命令的寻址打印 文本模式过滤行内容 sed的 ...

  8. [转帖]arm linux下编译xtrabackup-2.4.5

    环境:aarch64/centos7.6  glibc-2.17 编译器:gcc version 5.5.0 (GCC) 官方参考文档:https://www.percona.com/doc/perc ...

  9. 【转帖】MySQL 8.0.32如期而至

    MySQL 8.0版本计划 MySQL 8.0开始采用快速迭代开发模式,基本上是每隔3个月就发布一个新的小版本.去年1月18日(2022.1.18)发布MySQL 8.0.28,今年1月17日发布My ...

  10. CDP技术系列(三):百万级QPS的人群命中服务接口性能优化指南

    一.背景介绍 CDP系统提供了强大的标签和群体的构建能力,面对海量数据的标签和群体,我们采用了Bitmap+ClickHouse的存储与计算方案.详细内容可以参考之前文章. 有了群体之后,它们被广泛的 ...