poj1236 Network of Schools(tarjan缩点)

本文介绍了一个关于学校网络传输的问题解决方法。利用Tarjan算法寻找强连通分量并进行缩点,进而求解有向无环图(DAG)中的入度与出度,最终确定最少软件备份数量及所需添加边数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:一些学校连成了网络, 在学校之间存在某个协议:每个学校都维护一张传送表,表明他们要负责将收到的软件传送到表中的所有学校。如果A在B的表中,那么B不一定在A的表中。现在的任务就是,给出所有学校及他们维护的表,问1、如果所有学校都要被传送到,那么需要几份软件备份;2、如果只用一份软件备份,那么需要添加几条边?

思路:先使用tarjan算法找强连通分量,并进行缩点。对于缩点后的图,求每个点的入度和出度,第1问就是图中入度为0的点的个数,而第2问则是入度为0的点的个数和出度为0的点的个数这两者中较大的那一个。(参考DAG性质:对于一个有向无环图,若想让它成为强连通图,至少需要添加max(a,b) a为入度为0的边点的数量,b为出度为0的点的数量

代码:

#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#define MAXN 105
using namespace std;

vector<int> node[MAXN];
stack<int> S;
int DFN[MAXN], LOW[MAXN], belong[MAXN], out[MAXN], in[MAXN];
bool vis[MAXN];
int tot;
int cnt;

void tarjan(int u)
{
	int v;
	DFN[u] = LOW[u] = ++tot;
	S.push(u);
	vis[u] = 1;
	for (int i = 0; i < node[u].size(); i++)
	{
		v = node[u][i];
		if (!DFN[v])
		{
			tarjan(v);
			LOW[u] = min(LOW[u], LOW[v]);
		}
		else if(vis[v])
			LOW[u] = min(LOW[u], DFN[v]);
	}
	if (DFN[u] == LOW[u])
	{
		cnt++;
		do {
			v = S.top();
			S.pop();
			vis[v] = 0;
			belong[v] = cnt;
		} while (v != u);
	}
}

int main()
{
	//fstream cin("test.txt");
	int n, ans1, ans2;
	ans1 = ans2 = 0;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int to;
		while (cin >> to, to)
			node[i].push_back(to);
	}
	for (int i = 1; i <= n; i++)
	{
		if (!DFN[i])
			tarjan(i);
	}
	for (int i = 1; i <= n; i++)
		for (int j = 0; j < node[i].size(); j++)
		{
			//计算出度
			if (belong[i] != belong[node[i][j]])
			{
				out[belong[i]]++;
				in[belong[node[i][j]]]++;
			}		
		}
	for (int i = 1; i <= cnt; i++)
	{
		if (in[i] == 0)
			ans1++;
		if (out[i]== 0)
			ans2++;
	}
	if (cnt == 1)
		cout << 1 << endl << 0 << endl;
	else
	{
		cout << ans1 << endl;
		cout << max(ans1, ans2) << endl;
	}
	//system("pause");
	return 0;
}


基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值