POJ 1236 Network of Schools (强连通分量缩点求度数)
题意:
求一个有向图中:
(1)要选几个点才能把的点走遍
(2)要添加多少条边使得整个图强联通
分析:
对于问题1, 我们只要求出缩点后的图有多少个入度为0的scc就好, 因为有入度的scc可以从其他地方到达。
对于问题2, 每个入度为0的scc, 都可以补一条边可以变成强连通图, 每个出度为0的scc, 也可以补一条边使其变成强连通图。 所以答案就是max(入度为0scc个数,出度为0scc个数)。
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<cmath>
#define mem(a) memset(a, 0, sizeof(a))
#define rep(i,a,b) for(int i = a; i < b; i++)
#define _rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;
const int maxn = ;
vector<int> G[maxn];
int n, m, Index = , scc_cnt = ;
int dfn[maxn], low[maxn], vis[maxn], scc[maxn];
int in_deg[maxn], out_deg[maxn];
stack<int> s;
void tarjan(int u){
dfn[u] = Index;
low[u] = dfn[u];
Index++; vis[u] = ;
s.push(u);
for(int i = ; i < G[u].size(); i++){
int v = G[u][i];
if(!dfn[v]){
tarjan(v);
low[u] = min(low[v], low[u]); }else if(vis[v]){
low[u] = min(low[u], dfn[v]);
}
}
if(dfn[u] == low[u]){
vis[u] = ;
scc[u] = scc_cnt;
int t;
for(;;){
int t = s.top(); s.pop();
scc[t] = scc_cnt;
vis[t] = ;
if(t == u) break;
}
scc_cnt++;
}
}
int main(){
while(~scanf("%d", &n)){
_rep(i,,n) G[i].clear();
mem(dfn), mem(low), mem(vis), mem(scc), mem(in_deg), mem(out_deg);
Index = , scc_cnt = ;
_rep(i,,n){
int v;
while(scanf("%d", &v) && v){
G[i].push_back(v);
m++;
}
} _rep(i,,n){
if(!dfn[i]) tarjan(i);
}
_rep(u,,n) rep(i,,G[u].size()){//缩点,枚举每条边, 如果不在同一个scc说明这是新图中的一条边
int v = G[u][i];
if(scc[u] != scc[v]){
out_deg[scc[u]]++, in_deg[scc[v]]++;
}
}
int _0in = , _0out = ; //入度为0的scc , 出度为0的scc
rep(i,,scc_cnt){
if(in_deg[i] == ) _0in++;
if(out_deg[i] == ) _0out++;
}
if(scc_cnt > )
printf("%d\n%d\n", _0in, max(_0in,_0out)); //
else printf("1\n0\n");//特判一下只有一个scc的情况, 那么只用选一个点
}
return ;
}
POJ 1236 Network of Schools (强连通分量缩点求度数)的更多相关文章
- POJ 1236 Network Of Schools (强连通分量缩点求出度为0的和入度为0的分量个数)
Network of Schools A number of schools are connected to a computer network. Agreements have been dev ...
- POJ1236 Network of Schools —— 强连通分量 + 缩点 + 入出度
题目链接:http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K Tot ...
- POJ 1236 Network of Schools(Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16806 Accepted: 66 ...
- Network of Schools(强连通分量缩点(邻接表&矩阵))
Description A number of schools are connected to a computer network. Agreements have been developed ...
- poj 1236 Network of Schools(tarjan+缩点)
Network of Schools Description A number of schools are connected to a computer network. Agreements h ...
- Network of Schools(强连通分量+缩点) (问添加几个点最少点是所有点连接+添加最少边使图强连通)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13801 Accepted: 55 ...
- poj~1236 Network of Schools 强连通入门题
一些学校连接到计算机网络.这些学校之间已经达成了协议: 每所学校都有一份分发软件的学校名单("接收学校"). 请注意,如果B在学校A的分发名单中,则A不一定出现在学校B的名单中您需 ...
- 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 ...
随机推荐
- Bank Hacking CodeForces - 796C
题目 题意: 一条笨狗要去黑银行,银行有n个,它们之间用n-1条边连接.可以选择任意一个银行开始黑,但是后面每一次黑的银行都要求与已经黑过的银行直接相连.每个银行初始有一个防御值,每一个银行被黑后,与 ...
- 浅谈Java中static作用--转
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...
- Linux下文件权限的设置
文件/目录权限设置命令:chmod 这是Linux系统管理员最常用到的命令之一,它用于改变文件或目录的访问权限.该命令有两种用法: 用包含字母和操作符表达式的文字设定法 ) 其语法格式为:chmod ...
- jmeter(十八)属性和变量
一.Jmeter中的属性: 1.JMeter属性统一定义在jmeter.properties文件中,我们可以在该文件中添加自定义的属性 2.JMeter属性在测试脚本的任何地方都是可见的(全局),通常 ...
- c#学习系列之装箱拆箱
1. 装箱和拆箱是一个抽象的概念 2. 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的 ...
- 523 Continuous Subarray Sum 非负数组中找到和为K的倍数的连续子数组
非负数组中找到和为K的倍数的连续子数组 详见:https://leetcode.com/problems/continuous-subarray-sum/description/ Java实现: 方法 ...
- C#基础学习3
运算符,表达式!
- SQL系列函数——字符串函数
1.charindex函数用来寻找一个指定的字符(串)在另一个字符串中的起始位置,返回一个整数,没找到就返回0. select CHARINDEX('SQL','Microsoft SQL SERVE ...
- 转 Java 208道面试题及部分答案 补充部分答案
转自https://www.cnblogs.com/chen1005/p/10481102.html ---恢复内容开始--- 一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE ...
- 【转】java编程思想第20章的注解例子用到的com.sun.mirror的jar包
Java編程思想>中的注解代码中引入过这么一个包(com.sun.mirror),书上说的是在Jdk中有个tools.jar中,引入这个包就每这个问题了,但是笔者用的是JDK 1.8,把这个包i ...