传送门:Network of Schools

题意:一些学校联接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(A学校支援学校B,并不表示B学校一定支援学校A)。当某校获得一个新软件时,无论是直接获得还是通过网络获得,该校都应立即将这个软件通过网络传送给它应支援的学校。因此,一个新软件若想让所有联接在网络上的学校都能使用,只需将其提供给一些学校即可。第一问:至少需要多少份软件,才能使得所有学校都能拥有软件;第二问:如果只用一份软件,那么需要添加多少条变,使得所有学校都能拥有软件。

分析:一个强连通分量中必定能相互连通,肯定能共享一个软件,因此第一问只需求入度为0的强连通分量个数即可。第二问求需要添加多少条变,使得整个图都成为一个强连通,即任意两个学校都可到达,那么取入度为0的个数a和出度为0的个数b中的最大值,因为强连通分量中必定不会有出度为0或入度为0的点,因此首先用边连接入度和出度为0的点,等其中一个完后再任意连接边把出度为0或入度为0的点补完。

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 110
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int,int>
using namespace std;
struct edge
{int v,next;edge(){}edge(int v,int next):v(v),next(next){}
}e[N*N];
int n,scc,step,top,tot;
int head[N],dfn[N],low[N],belong[N],Stack[N];
int in[N],out[N];
bool instack[N];
void init()
{tot=0;step=0;scc=0;top=0;FILL(head,-1);FILL(dfn,0);FILL(low,0);FILL(instack,false);FILL(in,0);FILL(out,0);
}
void addedge(int u,int v)
{e[tot]=edge(v,head[u]);head[u]=tot++;
}
void tarjan(int u)
{int v;dfn[u]=low[u]=++step;Stack[top++]=u;instack[u]=true;for(int i=head[u];~i;i=e[i].next){v=e[i].v;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(instack[v]){low[u]=min(low[u],dfn[v]);}}if(dfn[u]==low[u]){scc++;do{v=Stack[--top];instack[v]=false;belong[v]=scc;}while(v!=u);}
}
void solve()
{for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);if(scc==1){printf("1\n0\n");return;}for(int u=1;u<=n;u++){for(int i=head[u];~i;i=e[i].next){int v=e[i].v;if(belong[v]!=belong[u]){out[belong[u]]++;in[belong[v]]++;}}}int a=0,b=0;for(int i=1;i<=scc;i++){if(!in[i])a++;if(!out[i])b++;}printf("%d\n%d\n",a,max(a,b));
}
int main()
{int u;while(scanf("%d",&n)>0){init();for(int i=1;i<=n;i++){while(scanf("%d",&u)&&u)addedge(i,u);}solve();}
}

View Code

转载于:https://www.cnblogs.com/lienus/p/4278692.html

poj1236(强连通缩点)相关推荐

  1. Poj 2186 Popular Cows(Tarjan 强连通缩点)

    传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解 ...

  2. BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...

  3. 2019ICPC(银川) - Delivery Route(强连通缩点+分块最短路)

    题目链接:点击查看 题目大意:给出n个点和m条边构成的图,每条边都有权值,其中m1条边是双向的,且权值非负,有m2条边是单向的,且权值可负,现在要求从给定起点st到其他每个点的最短路,若不存在路径则输 ...

  4. HDU - 4685 Prince and Princess(强连通缩点+二分图完备匹配)

    题目链接:点击查看 题目大意:给出n个王子和m个公主,每个王子都有喜欢的公主,题目需要我们在尽可能多的王子可以匹配到喜欢的公主的情况下,求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后, ...

  5. POJ - 1904 King's Quest(强连通缩点)

    题目链接:点击查看 题目大意:给出n个王子和n个公主,每个王子都有喜欢的公主,每个王子初始时都娶到了一位喜欢的公主,题目需要我们求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后,其他的王 ...

  6. POJ - 1236 Network of Schools(强连通缩点)

    题目链接:点击查看 题目大意:一个学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校A支援学校B,并不表示学校B一定支援学校A).当某校获得一个新软件时,无论是 ...

  7. 有向图缩点:tarjan强连通缩点(模板)

    SCC强连通缩点:(用之前记得init) 可以将有向图转换为一个 DAG 图,然后进行拓扑 const int N=1e4+100;const int M=1e5+100;struct Egde {i ...

  8. 图论--SCC强连通缩点--Tarjan

    强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...

  9. Wikioi 2822爱在心中(强连通缩点+dfs)

    2822 爱在心中(强连通缩点+遍历) 2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description " ...

  10. 队爷的讲学计划 (强连通缩点+最短路)

    队爷的讲学计划 [问题描述] 队爷为了造福社会,准备到各地去讲学.他的计划中有n个城市,从u到v可能有一条单向道路,通过这条道路所需费用为q.当队爷在u城市讲学完之后,u城市会派出一名使者与他同行,只 ...

最新文章

  1. 大流量高并发量网站的之解决方案
  2. Mysql主从和redis集群哪个好_Redis的三种模式:主从、哨兵、集群
  3. python使用threading模块实现多线程
  4. 解析XML的4种方式及优缺点比较
  5. OpenGL 点光源阴影Point Shadows
  6. Metrics, tracing 和 logging 的关系
  7. 【debug】使用lambda在循环中传参时,参数总为同一个值
  8. 苹果邮箱收发件服务器
  9. 618期间, “直播带货”翻车负面信息暴增
  10. BZOJ1823[JSOI2010]满汉全席——2-SAT+tarjan缩点
  11. [Java] 蓝桥杯ADV-175 算法提高 三个整数的排序
  12. python读取配置文件 分段_python配置文件读取
  13. C++编程语言中创建类的对象(类的初始化)的方法
  14. 常用制图工具Visio-ProcessOn
  15. x200装linux驱动下载,佳能 ThinkPad X200 Tablet 驱动程序下载-更新佳能软件(平板电脑)...
  16. UMD算法讲义——Lecture 2:算法设计:稳定婚姻问题
  17. 使用GCD 转自 Posted by 唐巧
  18. 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题
  19. 无穷小进课堂,历史在召唤
  20. Linux系统编程 50 -stat和stat函数 穿透和非穿透

热门文章

  1. 解释器模式(interpreter)解析例子
  2. 小程序自定义分享事件及回调函数
  3. jakarta-taglibs-standard-1.1.0查找下载
  4. ural 1113,jeep problem
  5. kendoui仪表盘和柱状图 示例
  6. SQL临时表的生存期问题
  7. SkipList 跳表
  8. 转:经典论文翻译导读之《Google File System》
  9. 索尼同意支付数百万美元和解 PS3,Linux 集体诉讼
  10. 解决ubuntu ufw开启时,kvm虚拟机网络全部无法访问