//题意:
//给你n个学校,其中每一个学校都和一些其他学校有交流,但是这些边都是单向的。你至少需要给几个学校
//传递消息可以使全部学校都收到消息,第二问你最少添加几条边可以使它变成一个强连通图
//题解:
//首先是第一问,这个你只需要找出来一共有几个连通块就可以了,也相当于有几个入度为0的点(这个时候就不是
//之前的图,是要缩点后的图来找出入度)
//第二问:找出来所有点中max(入度为0,出度为0)

为什么要找它们的最大值:(黑边为原来存在的,红边是添加的,使这个图变成强连通图的)

或者

反正不管怎么连边,它们对少需要3条边才可以成为强连通图(从任意一个点可以到达图中的其他点)

或者

上代码:

  1 //题意:
2 //给你n个学校,其中每一个学校都和一些其他学校有交流,但是这些边都是单向的。你至少需要给几个学校
3 //传递消息可以使全部学校都收到消息,第二问你最少添加几条边可以使它变成一个强连通图
4 //题解:
5 //首先是第一问,这个你只需要找出来一共有几个连通块就可以了,也相当于有几个入度为0的点(这个时候就不是
6 //之前的图,是要缩点后的图来找出入度)
7 //第二问:找出来所有点中max(入度为0,出度为0)
8 #include<stdio.h>
9 #include<string.h>
10 #include<iostream>
11 #include<algorithm>
12 #include<map>
13 #include<math.h>
14 #include<set>
15 #include<queue>
16 using namespace std;
17 typedef long long ll;
18 const int maxn=105;
19 const int mod=26;
20 const int INF=0x3f3f3f3f;
21 const int block=300;
22 struct edge
23 {
24 int u,v,next;
25 bool sign;
26 }e[maxn*maxn];
27 int head[maxn],cnt;
28 void add_edge(int x,int y)
29 {
30 e[cnt].u=x;
31 e[cnt].v=y;
32 e[cnt].next=head[x];
33 head[x]=cnt++;
34 }
35 int dfn[maxn],low[maxn],stacks[maxn],top,tot;
36 int taj;
37 int belong[maxn],visit[maxn];
38 vector<int>w[maxn];
39 void tarjan(int x,int fx)
40 {
41 dfn[x]=low[x]=++tot;
42 stacks[top++]=x;
43 visit[x]=1;
44 for(int i=head[x];i!=-1;i=e[i].next)
45 {
46 int v=e[i].v;
47 if(!dfn[v])
48 {
49 tarjan(v,x);
50 low[x]=min(low[x],low[v]);
51 if(dfn[x]<low[v])
52 {
53 e[i].sign=1;
54 }
55 }
56 else if(visit[v])
57 {
58 low[x]=min(low[x],dfn[v]);
59 }
60 }
61 if(low[x]==dfn[x])
62 {
63 int now;
64 taj++;
65 w[taj].clear();
66 do{
67 now=stacks[--top];
68 visit[now]=0;
69 belong[now]=taj;
70 w[taj].push_back(now);
71 }while(now!=x);
72 }
73 }
74 void tarjan_init(int n)
75 {
76 memset(visit,0,sizeof(visit));
77 top=tot=taj=0;
78 for(int i=1;i<=n;++i)
79 {
80 if(!dfn[i]) tarjan(i,i);
81 }
82 }
83 vector<int>g[maxn];
84 int cu[maxn],ru[maxn];
85 void suodian()
86 {
87 memset(cu,0,sizeof(cu));
88 memset(ru,0,sizeof(ru));
89 for(int i=1;i<=taj;++i)
90 g[i].clear();
91 for(int i=0;i<cnt;++i)
92 {
93 int u=belong[e[i].u];
94 int v=belong[e[i].v];
95 if(u!=v) g[u].push_back(v),cu[u]++,ru[v]++;//printf("%d %d\n",u,v);
96 }
97 }
98 int vis[maxn];
99 void init()
100 {
101 memset(head,-1,sizeof(head));
102 cnt=0;
103 }
104 int main()
105 {
106 int a,n;
107 scanf("%d",&n);
108 init();
109 for(int i=1;i<=n;++i)
110 {
111 while(~scanf("%d",&a) && a)
112 {
113 add_edge(i,a);
114 }
115 }
116 tarjan_init(n);
117 if(taj==1)
118 {
119 printf("1\n0\n");
120 return 0;
121 }
122 // for(int i=1;i<=n;i++)
123 //
124 // if(dfn[i]==-1)
125 //
126 // tarjan(i,-1);
127 //for(int i)
128 //printf("%d**\n",taj);
129 suodian();
130 int ans1=0,ans2=0;
131 for(int i=1;i<=taj;++i)
132 {
133 if(ru[i]==0)
134 ans1++;
135 if(cu[i]==0)
136 ans2++;
137 }
138 printf("%d\n%d\n",ans1,max(ans1,ans2));
139 return 0;
140 }

Network of Schools POJ - 1236 有向强连通图的更多相关文章

  1. Network of Schools POJ - 1236 (强联通)

    一些学校连接到了一个计算机网络.网络中的学校间有如下约定:每个学校维护一个列表,当该学校收到软件或信息后将会转发给列表中的所有学校(也就是接收方列表).需要注意的是如果B学校在A学校的接收方列表中,A ...

  2. A - Network of Schools - poj 1236(求连通分量)

    题意:学校有一些单向网络,现在需要传一些文件,1,求最少需要向几个学校分发文件才能让每个学校都收到,2,需要添加几条网络才能在任意一个学校分发都可以传遍所有学校. 分析:首先应该求出来连通分量,进行缩 ...

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

    题目大意 有N个学校,这些学校之间用一些单向边连接,若学校A连接到学校B(B不一定连接到A),那么给学校A发一套软件,则学校B也可以获得.现给出学校之间的连接关系,求出至少给几个学校分发软件,才能使得 ...

  4. POJ 1236——Network of Schools——————【加边形成强连通图】

    Network of Schools Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u ...

  5. poj 1236 Network of Schools【强连通求孤立强连通分支个数&&最少加多少条边使其成为强连通图】

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13800   Accepted: 55 ...

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

    POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意:  给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...

  7. Poj 1236 Network of Schools (Tarjan)

    题目链接: Poj 1236 Network of Schools 题目描述: 有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个 ...

  8. POJ 1236 Network of Schools(Tarjan缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16806   Accepted: 66 ...

  9. poj 1236 Network of Schools(连通图入度,出度为0)

    http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

随机推荐

  1. 洛谷P1198 [JSOI2008]最大数(线段树/单调栈)

    题目链接: https://www.luogu.org/problemnew/show/P1198 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询 ...

  2. URL重定向 - Pikachu

    概述: 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方.如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能 ...

  3. 基于Dockfile构建JAVA环境网站镜像

    查看本地目录 [root@docker tomcat]# ls apache-tomcat-8.5.16.tar.gz  Dockerfile  jdk-8u91-linux-x64.tar.gz   ...

  4. wmic process进程管理

    process    进程管理工具 示例:1.列举当前的进程.进程路径.命令行.进程ID.父进程ID.线程数,内存使用::wmic process get name,executablepath,co ...

  5. std::thread线程库详解(3)

    目录 目录 前言 lock_guard scoped_lock (C++17) unique_lock shared_lock 总结 ref 前言 前两篇的博文分别介绍了标准库里面的线程和锁,这一次的 ...

  6. saltstack 服务器批量管理

    学习saltstack 服务器批量管理 1.saltstack 简介 SaltStack是一个开源的.新的基础平台管理工具,使用Python语言开发,同时提供Rest API方便二次开发以及和其他运维 ...

  7. STP 根桥、根端口、指定端口是如何选举的

    学习HCIA过程中,对交换机的根桥.跟端口以及指定端口选举有些迷糊,也度娘了一番,总觉得一部分人解释的不够全面精细.通过仔细研究最终有了自己的理解,分享给大家,如果纰漏,欢迎指正. STP收敛过程: ...

  8. 脑裂 CAP PAXOS 单元化 网络分区 最终一致性 BASE

    阿里技术专家甘盘:浅谈双十一背后的支付宝LDC架构和其CAP分析 https://mp.weixin.qq.com/s/Cnzz5riMc9RH19zdjToyDg 汤波(甘盘) 技术琐话 2020- ...

  9. RPC 接口必须是业务职责

    https://mp.weixin.qq.com/s/MYSF8lCF92ItG_Lc8nOspg 一个加班多新人多团队,我们的代码问题与重构 陈于喆 高可用架构 2020-10-21   微服务编码 ...

  10. SumatraPDF设置护眼背景

    高级选项中: 1 FixedPageUI [ 2 TextColor = #000000 3 BackgroundColor = #C7EDCC 4 SelectionColor = #f5fc0c ...