POJ 1236 学校网络间的强连通
题目大意:
N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。
链接http://vjudge.net/problem/viewProblem.action?id=17001
每个强连通分量内只要有任意一个学校获得一份软件就可以了,因为强连通分量内的任意两点是相互可达的。
也就是说,在一个强联通分量内的学校可以当作一个学校!
那么第一问我们所求的就是强连通分量重入度为零的点
而第二问因为两个强连通合并必然是出度为0的连接入度为0的点,所以要解决掉入度为0,和出度为0的点,所以答案是这两个的最大值(点指缩点)。
利用scc[i]=scc_cnt 来记录i这个点属于scc_cnt这个连通分量
总代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
#define N 105
int first[N],scc[N],dfn[N],low[N],degreeIn[N],degreeOut[N],k,n,tmpdfn,scc_cnt;
stack<int> q;
struct Path{
int y,next;
}path[];
void init()
{
memset(first,-,sizeof(first));
memset(dfn,,sizeof(dfn));
memset(degreeIn,,sizeof(degreeIn));
memset(degreeOut,,sizeof(degreeOut));
memset(scc,,sizeof(scc));
scc_cnt=,tmpdfn=,k=;
}
void add(int x,int y)
{
path[k].y=y,path[k].next=first[x];
first[x]=k;
k++;
}
void dfs(int u)
{
dfn[u]=low[u]=++tmpdfn;
q.push(u);
for(int i=first[u];i!=-;i=path[i].next){
int v=path[i].y;
if(!dfn[v]){
dfs(v);
low[u]=min(low[v],low[u]);
}
else if(!scc[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
scc_cnt++;
for(;;){
int v=q.top(); q.pop();
scc[v]=scc_cnt;
if(u==v) break;
}
}
}
void get_scc()
{
while(!q.empty()) q.pop();
for(int i=;i<=n;i++)
if(!dfn[i]) dfs(i);
//cout<<"OK"<<endl;
for(int i=;i<=n;i++){
for(int j=first[i];j!=-;j=path[j].next){
int v=path[j].y;
//cout<<v<<endl;
if(scc[i]!=scc[v]){
degreeOut[scc[i]]++;
degreeIn[scc[v]]++;
}
}
}
}
int main()
{
int i,a;
while(~scanf("%d",&n)){
int ans1=,ans2=;
init();
for(i=;i<=n;i++){
while(scanf("%d",&a) && a) add(i,a);
}
get_scc();
//for(int i=1;i<=scc_cnt;i++) cout<<degreeIn[i]<<endl;
//cout<<scc_cnt<<endl;
for(int i=;i<=scc_cnt;i++){
if(!degreeOut[i]) ans1++;
if(!degreeIn[i]) ans2++;
}
ans1=max(ans1,ans2);
//cout<<"Á¬Í¨·ÖÁ¿£º"<<cnt<<endl;
if(scc_cnt>){
printf("%d\n",ans2);
printf("%d\n",ans1);
}
else printf("1\n0\n");
}
return ;
}
POJ 1236 学校网络间的强连通的更多相关文章
- 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 学校传数据 强连通+缩点+DAG
题意描述: 网络中有一些学校,每个学校可以分发软件给其他学校.可以向哪个分发取决于他们各自维护的一个清单. 两个问题 1:至少要copy多少份新软件给那些学校, 才能使得每个学校都能得到. 2:要在所 ...
- POJ 1236 Network of Schools(强连通分量/Tarjan缩点)
传送门 Description A number of schools are connected to a computer network. Agreements have been develo ...
- poj 1236 Network of Schools(又是强连通分量+缩点)
http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- poj 1236 Network of Schools (强连通分量+缩点)
题目大概: 每个学校都可以把软件复制好,交给它名单上的学校. 问题A:把软件复制成几份,然后交给不同的学校,所有学校才能够都有软件. 问题B:添加几条边,能使得这个图变成强连通图. 思路: 找出所有的 ...
- poj 1236 Network of Schools(强连通、缩点、出入度)
题意:给出一个有向图.1:问至少选出多少个点,才能沿有向边遍历所有节点.2:问至少加多少条有向边,使原图强连通. 分析:第一个问题,缩点后找所有树根(入度为0).第二个问题,分别找出入度为0和出度为0 ...
- poj 1236 Network of Schools【强连通求孤立强连通分支个数&&最少加多少条边使其成为强连通图】
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13800 Accepted: 55 ...
- POJ 1236.Network of Schools (强连通)
首先要强连通缩点,统计新的图的各点的出度和入度. 第一问直接输出入度为0的点的个数 第二问是要是新的图变成一个强连通图,那么每一个点至少要有一条出边和一条入边,输出出度和入度为0的点数大的那一个 注意 ...
随机推荐
- [转]List of Visual Studio Project Type GUIDs
本文转自:http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs There isn' ...
- AJPFX关于Set接口学习笔记及总结
Set接口中的方法和Collection中方法一致的.Set接口取出方式只有一种,迭代器. |--HashSet:底层数据结构是哈希表,线程是不同步的.无序,高效: HashSet集合保证元素唯一性: ...
- apache配置多域名
环境:mac,其他环境也可做参考 hosts配置 eg:sudo vim /etc/hosts 127.0.0.1 www.testphalcon.com apache配置 找到apache对应安装目 ...
- VTK教程系列:VTK基础及应用开发教程
由于OpenCV不能使用,只能使用VTK库的图像处理库,暂时还没有找到其他可以全面替代的库: CSDN东灵工作室:http://blog.csdn.net/www_doling_net/article ...
- Android(java)学习笔记172:服务(service)之绑定服务调用服务里面的方法 (采用接口隐藏代码内部实现)
1. 接口 接口可以隐藏代码内部的细节,只暴露程序员想暴露的方法 2. 利用上面的思想优化之前的案例:服务(service)之绑定服务调用服务里面的方法,如下: (1)这里MainActivity.j ...
- mysql查询-从表1中查询出来的结果重新插入到表1
原有表结构 CREATE TABLE `t_card_user` ( `id` varchar(32) NOT NULL, `card_user_id` bigint(20) DEFAULT NULL ...
- oracle的系统表
-- DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是视图-- DBA_TABLES意为DBA拥有的或可以访问的所有的关系表.-- ALL_TABLES意为某一 ...
- vscode 打开新文件不替换旧文件
设置 "workbench.editor.enablePreview": false
- nodejs 安装 淘宝镜像
临时使用 npm --registry https://registry.npm.taobao.org install express 2.持久使用 npm config set registry h ...
- Unity整合Asp.Net MVC
先来看一下我们的解决方案 我们建立Yubay.Models项目, using System; using System.Collections.Generic; using System.Data.E ...