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

news/2025/2/25 19:35:01

【题目链接】

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);
		}
		else
			low[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是割点 
		}
		else
			low[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.niftyadmin.cn/n/5865889.html

相关文章

TD时间差分算法

TD算法用来估计value-state 给定data/experiece of algorithm&#xff0c; TD算法&#xff1a; 其中TD error&#xff1a; δ t v ( s t ) − [ r t 1 γ v ( s t 1 ) ] v ( s t ) − v t ‾ \delta_t v(s_t) -[r_{t1} \gamma v(s_{t1})]v(s_t) - \overline{v_{t}} δ…

Vue使用Three.js加载glb (gltf) 文件模型及实现简单的选中高亮、测距、测面积

安装&#xff1a; # three.jsnpm install --save three 附中文网&#xff1a; 5. gltf不同文件形式(.glb) | Three.js中文网 附官网&#xff1a; 安装 – three.js docs 完整代码&#xff08;简易demo&#xff09;&#xff1a; <template><div class"siteInspe…

【复习】计算机网络

网络模型 OSI 应用层&#xff1a;给应用程序提供统一的接口表示层&#xff1a;把数据转换成兼容另一个系统能识别的格式会话层&#xff1a;负责建立、管理、终止表示层实体之间的通信会话传输层&#xff1a;负责端到端的数据传输网络层&#xff1a;负责数据的路由、转发、分片…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(二)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷&#xff08;二&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&…

3. Spring Cloud LoadBalancer 入门与使用

一、什么是 LoadBalancer? LoadBalancer(负载均衡器)是一种网络设备或软件机制&#xff0c;用于分发传入的网络流量负载(请求)到多个后端目标服务器上&#xff0c;从而实现系统资源的均衡利用和提高系统的可用性和性能。 1.1 负载均衡分类 服务器负载均衡是在服务端通过硬件…

Seata分布式事务【详解分布式事务AT模式、2PC两阶段提交协议、Seata Server(TC)环境搭建,附有示例+代码】

文章目录 六.Seata 分布式事务6.1 分布式事务介绍6.2 常见分布式事务解决方案6.3 2PC两阶段提交协议&#xff1a;Prepare&#xff1a;提交事务请求Commit&#xff1a;执行事务提交2PC问题 6.4 AT 模式介绍6.5 Seata是什么&#xff1f;6.6 Seata快速开始Seata Server&#xff08…

Apache Pinpoint工具介绍

Apache Pinpoint&#xff1a;分布式系统性能分析与链路追踪 一、Pinpoint 简介 Apache Pinpoint 是一个开源的 分布式追踪系统&#xff0c;专为微服务架构设计&#xff0c;支持 HTTP、RPC、MQTT 等协议的调用链追踪。其核心功能包括&#xff1a; 链路可视化&#xff1a;展示…

一个用于测试内存屏障差异的 C 语言示例程序

下面是一个用于测试内存屏障差异的 C 语言示例程序,演示在弱内存模型(如 ARM Cortex-A35)中,指令重排序可能导致的数据不一致问题,并对比不同同步机制的效果: 测试目标 验证以下场景: 无内存屏障:多线程环境下可能出现数据竞争。内存屏障:强制指令顺序,避免数据竞争…