Network of Schools POJ - 1236 有向强连通图
//题意:
//给你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 有向强连通图的更多相关文章
- Network of Schools POJ - 1236 (强联通)
一些学校连接到了一个计算机网络.网络中的学校间有如下约定:每个学校维护一个列表,当该学校收到软件或信息后将会转发给列表中的所有学校(也就是接收方列表).需要注意的是如果B学校在A学校的接收方列表中,A ...
- A - Network of Schools - poj 1236(求连通分量)
题意:学校有一些单向网络,现在需要传一些文件,1,求最少需要向几个学校分发文件才能让每个学校都收到,2,需要添加几条网络才能在任意一个学校分发都可以传遍所有学校. 分析:首先应该求出来连通分量,进行缩 ...
- Network of Schools POJ - 1236(强连通+缩点)
题目大意 有N个学校,这些学校之间用一些单向边连接,若学校A连接到学校B(B不一定连接到A),那么给学校A发一套软件,则学校B也可以获得.现给出学校之间的连接关系,求出至少给几个学校分发软件,才能使得 ...
- POJ 1236——Network of Schools——————【加边形成强连通图】
Network of Schools Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u ...
- poj 1236 Network of Schools【强连通求孤立强连通分支个数&&最少加多少条边使其成为强连通图】
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13800 Accepted: 55 ...
- POJ 1236 Network of Schools(强连通 Tarjan+缩点)
POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意: 给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...
- Poj 1236 Network of Schools (Tarjan)
题目链接: Poj 1236 Network of Schools 题目描述: 有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个 ...
- POJ 1236 Network of Schools(Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16806 Accepted: 66 ...
- poj 1236 Network of Schools(连通图入度,出度为0)
http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Su ...
随机推荐
- 关于JDK15的简单理解
一.为什么要了解JDK15? 2020年9月15日,Oracle官方发布了JDK15版本,及时关注官方的更新动态,可以让我们在日常开发中更合理的选择更加优秀的工具方法,避免使用一些过时的或一些即将被删 ...
- ASP.NET Core错误处理中间件[3]: 异常处理器
DeveloperExceptionPageMiddleware中间件错误页面可以呈现抛出的异常和当前请求上下文的详细信息,以辅助开发人员更好地进行纠错诊断工作.ExceptionHandlerMid ...
- 源代码增强的一点说明(souce code enhance )
souce code enhance 分为显式和隐式两种. 下面以显式创建为例子: 1.在ABAP编辑器中, 打开想要编辑的程序,切换到可编辑模式 2.在源代码中的指定位置右键,弹出菜单,选择 Enh ...
- BAPI_GOODSMVT_CREATE的参数GOODSMVT_CODE的说明
BAPI_GOODSMVT_CREATE 的功能就是用于货物移动,其主要可以实现MB*事物的一些功能,其中该BAPI的参数 GOODSMVT_CODE就控制了对应哪个事物码的功能,下面给出该参数的值和 ...
- MYSQL基础知识的复习3
聚合函数 max():求最大值 例:求最高工资 select max(sal) from emp; min():求最小值 例:求最小工资 select min(sal) from emp; avg() ...
- pytest:通过scope控制fixture的作用范围
一.fixture里面有个参数scope,通过scope可以控制fixture的作用范围,根据作用范围大小划分:session>module>class>function,具体作用范 ...
- 【python刷题】LRU
什么是LRU? LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰.该算法赋予每个页面一个访问字段,用来记录一个页面自上次 ...
- testng学习笔记-- beforeclass和afterclass
一.定义 类之前和类之后运行的方法 使用场景: 类运行之前是否需要静态方法,变量赋值,写完其他方法都可以用了 二.标签代码 三.运行结果
- ACID 原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。
https://en.wikipedia.org/wiki/ACID https://zh.wikipedia.org/wiki/ACID //ACID compliant , row-level l ...
- 回归测试_百度百科 https://baike.baidu.com/item/%E5%9B%9E%E5%BD%92%E6%B5%8B%E8%AF%95
回归测试_百度百科https://baike.baidu.com/item/%E5%9B%9E%E5%BD%92%E6%B5%8B%E8%AF%95