POJ 1236 Network of Schools (连通图 - Garbow 算法)
校园网:给定N所学校和网络,目标是分发软件其他学校都可收到,求①所需最少分发学校数;②若任选学校都能收到,最低新增边数。
思路:同一个强连通分量内的顶点合并为一个,在这个DAG上计算出度和入度。①其实是求入度为0的顶点数,②则是求0出度和0入度顶点数的较大者,因为要将这两类顶点连起来。
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
#define MAX_V 100 + 10
#define ms(a,b) memset(a,b,sizeof a)
int V; // 顶点数
vector<int> G[MAX_V]; // 图的邻接表表示
vector<int> rG[MAX_V]; // 反向图
vector<int> vs; // 后序遍历顺序的顶点列表
bool book[MAX_V]; // 访问标记
int cmp[MAX_V]; // 所属强连通分量的拓补序
int in[MAX_V], out[MAX_V]; // 入度、出度
void add_Edge(int from, int to) {
G[from].push_back(to);
rG[to].push_back(from);
}
void dfs(const int &v) {
book[v] = true;
for (int i = 0; i < G[v].size(); ++i) {
if (!book[G[v][i]])
dfs(G[v][i]);
}
vs.push_back(v);
}
void rdfs(const int& v, const int& k) {
book[v] = true;
cmp[v] = k;
for (int i = 0; i < rG[v].size(); ++i) {
if (!book[rG[v][i]])
rdfs(rG[v][i], k);
}
}
int scc() {
ms(book, false); vs.clear();
for (int v = 0; v < V; ++v) {
if (!book[v])
dfs(v);
}
ms(book, false);
int k = 0;
for (int i = vs.size() - 1; i >= 0; --i) {
if (!book[vs[i]])
rdfs(vs[i], k++);
}
return k;
}
int main() {
//freopen("in.txt","r",stdin);
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//尝试过快读,莫名比scanf和关闭流同步还速度慢
cin >> V;
for (int u = 0, v; u < V; ++u) {
while (cin>>v && v)
add_Edge(u, --v);
}
int n = scc();
// 特殊情况
if (n == 1)return cout << 1 << endl << 0, 0;
for (int u = 0; u < V; ++u)
for (int i = 0; i < G[u].size(); ++i) {
int v = G[u][i];
if (cmp[u] != cmp[v]) // 强连通分量算一个点
++out[cmp[u]], ++in[cmp[v]];
}
int zero_in = 0, zero_out = 0;
for (int i = 0; i < n; ++i){
if (in[i] == 0) ++zero_in;
if (out[i] == 0)++zero_out;
}
cout << zero_in << endl << max(zero_in, zero_out) << endl;
}
| Result | Memory | Time | Language | Code Length |
|---|---|---|---|---|
| Accepted | 700K | 16MS | G++ | 1691B |
POJ 1236 Network of Schools (连通图 - Garbow 算法)的更多相关文章
- POJ 1236 Network of Schools 连通图缩点
题目大意:有向图连通图,第一问求至少需要多少个软件才能传输到所有学校,第二问求至少需要增加多少条路使其成为强连通图 题目思路:利用Tarjan算法经行缩点,第一问就是求缩点后入度为0的点的个数(特殊情 ...
- POJ 1236 Network of Schools(tarjan算法 + LCA)
这个题目网上有很多答案,代码也很像,不排除我的.大家的思路应该都是taijan求出割边,然后找两个点的LCA(最近公共祖先),这两个点和LCA以及其他点构成了一个环,我们判断这个环上的割边有几条,我们 ...
- POJ 1236 Network of Schools (tarjan算法+缩点)
思路:使用tarjan求强连通分量并进行缩点,判断所有入度为0的点,这个点就是必须要给予文件的点,分别计算出度,入度为零的点的个数,取二者的最大值就是把这个图变成强连通需要加的边数. 一个取值需要讨论 ...
- POJ 1236 Network of Schools(强连通 Tarjan+缩点)
POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意: 给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...
- POJ 1236 Network of Schools(强连通分量)
POJ 1236 Network of Schools 题目链接 题意:题意本质上就是,给定一个有向图,问两个问题 1.从哪几个顶点出发,能走全全部点 2.最少连几条边,使得图强连通 思路: #inc ...
- Poj 1236 Network of Schools (Tarjan)
题目链接: Poj 1236 Network of Schools 题目描述: 有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个 ...
- poj 1236 Network of Schools(连通图入度,出度为0)
http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- poj 1236 Network of Schools(又是强连通分量+缩点)
http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- [tarjan] poj 1236 Network of Schools
主题链接: http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K To ...
- POJ 1236 Network of Schools(Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16806 Accepted: 66 ...
随机推荐
- 一个NET8 AOT编译的辅助项目,让你的任何可执行应用快速部署为服务
不知道大家有没有和小编一样,很多时候想将自己的一些应用转为服务运行,比如一些控制台应用或者.NET Core应用,但是又不想重新编码,把他们转为服务,本文将给大家提供些我使用过的方法,并提供一个基于N ...
- Linux-目录层次标准
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 根目录(/) 根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机.还原.系 ...
- 阿里云轻量服务器上编译安装docker trojan时报错 fatal error: Killed signal terminated program cc1plus compilation
轻量服务器编译安装docker trojan时报错 72%时 通过以下操作解决,和编译其他软件类似,是内存不足引起的 编译安装swoole的时候报错 fatal error: Killed sig ...
- 渐进式web全栈:blazor web app
前言 本文要说的这种开发模式,这种模式并不是只有blazor支持,js中有一样的方案next.js nuxt.js:blazor还有很多其它内容,本文近关注渐进式开发模式. 是的,前后端是主流,不过以 ...
- Nginx根据Origin配置禁止跨域访问策略
产品需要通过某所的安全测评扫描,其中提出一个关于跨域策略配置不当的问题,如下: 这个需要根据客户端传递的请求头中的Origin值,进行安全的跨站策略配置,目的是对非法的origin直接返回403错误页 ...
- springBoot——读取数据
在yml文件中读取数据,用$符号就可以 类似于这样的 如果要读取yml里面全部的数据,就用自动装配来写 而如果要用实体类来读取里面的数据 package com.example.springboot_ ...
- Python:单元测试框架unittest
1.什么是单元测试 测试函数/方法或者一段代码,用于检验被测代码的一个很小的.很明确的功能是否正确,通常是开发做. 在Python中的单元测试框架有Unittest和Pytest,现在总结Unitte ...
- ES索引误删的名场面
ES索引误删的名场面 慌了3秒,果断发个邮件: 01 最近,在版本发布时: ES线上未备份的索引,被当场「误删」了: 对于新手来说,妥妥的社死名场面: 对于老手来说,慌它3秒表示一下态度: 当时的情况 ...
- jenkins删除构建历史并重置构建序号
系统管理 工具和动作-->脚本命令执行 删除之前,现在已经构建了156次 输入脚本 println(Jenkins.instance.getJobNames()) //查看获取任务名列表//要 ...
- MOSS对话式大型语言模型
MOSS是复旦大学自然语言处理实验室发布的一种类似于ChatGPT的会话语言模型.MOSS能够按照用户的指示执行各种自然语言任务,包括回答问题.生成文本.摘要文本.生成代码等.MOSS还能够挑战错误的 ...