当前位置: 首页 > news >正文

信息学奥赛一本通 1522:网络 | OpenJudge 百练 1144:Network

【题目链接】

ybt 1522:网络
OpenJudge 百练 1144:Network

【题目考点】

1. 图论:割点

【解题思路】

每个交换机是一个顶点,如果两地点之间有电话线连接,那么两顶点之间有一条无向边,该图是无向图。
初始时任何地点之间都是可以通讯的,也就是说这是一个无向连通图。
如果一个交换机停止工作,导致其它一些地点不能通讯,这样的地点交灾区。那么也就是图中去掉该顶点后,有些顶点之间不再连通(没有路径),那么也就是整个图不再是连通图。这样的点就是割点。
灾区就是割点,统计灾区的数量就是统计割点的数量。
使用tarjan算法求出所有割点,将割点保存在一个set中,或用数组标记哪些顶点是割点,而后统计割点数量。

【题解代码】

解法1:Tarjan算法求割点,使用set保存割点
#include <bits/stdc++.h>
using namespace std;
#define N 105
int n, m;
vector<int> edge[N];//edge[i]:顶点i的邻接点 
int dfn[N], low[N], ts, root;
set<int> cutVer;
void tarjan(int u)
{int child = 0;dfn[u] = low[u] = ++ts;for(int v : edge[u]){if(dfn[v] == 0){tarjan(v);low[u] = min(low[u], low[v]);if(u == root && ++child > 1 || u != root && dfn[u] <= low[v])cutVer.insert(u);}elselow[u] = min(low[u], dfn[v]);} 
}
int main()
{int f, t;while(cin >> n && n != 0){ts = 0;//变量初始化 for(int i = 1; i <= n; ++i)edge[i].clear();memset(dfn, 0, sizeof(dfn));cutVer.clear();while(cin >> f && f != 0)while(cin.get() != '\n'){cin >> t;edge[f].push_back(t);edge[t].push_back(f);}for(int v = 1; v <= n; ++v) if(dfn[v] == 0)tarjan(root = v);cout << cutVer.size() << endl;}return 0;
}
解法2:Tarjan算法求割点,使用标记数组保存割点
#include <bits/stdc++.h>
using namespace std;
#define N 105
int n, dfn[N], low[N], ts, root, ct;
vector<int> edge[N];
bool cutVer[N];//cutVer[i]:i是否是割点
void tarjan(int u)
{int child = 0;dfn[u] = low[u] = ++ts;for(int v : edge[u]){if(dfn[v] == 0){tarjan(v);low[u] = min(low[u], low[v]);if(u == root && ++child > 1 || u != root && dfn[u] <= low[v])cutVer[u] = true;//u是割点 }elselow[u] = min(low[u], dfn[v]); }
} 
int main()
{int f, t;while(cin >> n && n != 0){ts = ct = 0;//变量初始化 for(int i = 1; i <= n; ++i)edge[i].clear();memset(cutVer, 0, sizeof(cutVer));memset(dfn, 0, sizeof(dfn));while(cin >> f && f != 0)while(cin.get() != '\n'){cin >> t;edge[f].push_back(t);edge[t].push_back(f);}for(int v = 1; v <= n; ++v) if(dfn[v] == 0)tarjan(root = v);for(int v = 1; v <= n; ++v) if(cutVer[v])//统计割点数量 ct++;cout << ct << endl;}return 0;
}
http://www.lryc.cn/news/542864.html

相关文章:

  • 本地部署DeepSeek的硬件配置建议
  • Redis面试题----Redis 的持久化机制是什么?各自的优缺点?
  • C#实现本地AI聊天功能(Deepseek R1及其他模型)。
  • Metal 学习笔记四:顶点函数
  • C# string转unicode字符
  • HITCON2017SSRFME-学习复盘
  • 【Http和Https区别】
  • 2025数学建模竞赛汇总,错过再等一年
  • 基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • ReentrantLock 用法与源码剖析笔记
  • 矩阵的 正定(Positive Definite)与负定(Negative Definite):从Fisher信息矩阵看“曲率”的秘密
  • 被裁20240927 --- WSL-Ubuntu20.04安装cuda、cuDNN、tensorRT
  • uniapp写的h5跳转小程序
  • [SWPUCTF 2022 新生赛]ez_rce
  • 递归、搜索与回溯算法 —— 名词解析
  • 【docker】docker swarm lock和unlock的区别,以及旧节点重启的隐患
  • Grafana使用日志5--如何重置Grafana密码
  • ELK搭建初入
  • JVM 高级面试题及答案整理,最新面试题
  • 第9章:LangChain结构化输出-示例5(基于大模型如何精确匹配POJO的字段)
  • ref和reactive的区别 Vue3
  • 基于MATLAB的OFDM通信系统仿真设计
  • 地铁站内导航系统:基于蓝牙Beacon与AR技术的动态路径规划技术深度剖析
  • JS复习练习题目、完整nodejs项目以及Commons、Es
  • Linux:理解O(1)调度算法的设计精髓
  • [C++][cmake]使用C++部署yolov12目标检测的tensorrt模型支持图片视频推理windows测试通过
  • Uppy - 免费开源、功能强大的新一代 web 文件上传组件,支持集成到 Vue 项目
  • 【游戏——BFS+分层图】
  • SSL 证书是 SSL 协议实现安全通信的必要组成部分
  • Spring 源码硬核解析系列专题(七):Spring Boot 与 Spring Cloud 的微服务源码解析