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 ...
随机推荐
- 剑指offer之重建二叉树
1.问题描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列pre {1,2,4,7,3,5,6, ...
- Jmeter(三十五) - 从入门到精通进阶篇 - 关联(详解教程)
1.简介 上一篇中介绍了如果想要同时发送多条请求,那么怎样才能让每条数据某些请求参数改变呢.这就用到了jMeter参数化.在实际测试场景中,我们往往还有这样的需求,登录后服务器响应的token作为下次 ...
- Azure App object和Service Principal
为了把Identity(身份)和Access Management function(访问管理功能)委派给Azure AD,必须向Azure AD tenant注册应用程序.使用Azure AD注册应 ...
- 未使用绑定变量对share_pool的影响
oracle SGA中包含数据高速缓冲,重做日志缓冲,以及共享池(share_pool).共享池中包含库高速缓冲(所有的SQL,执行计划等)和数据字典缓冲(对象的定义,权限等). 所以,如果SQL中没 ...
- LeetCode-P53题解【动态规划】
本文为原创,转载请注明:http://www.cnblogs.com/kylewilson/ 题目出处: https://leetcode.com/problems/maximum-subarray/ ...
- 同一份数据,Redis为什么要存两次
前言 在 Redis 中,有一种数据类型,当在存储的时候会同时采用两种数据结构来进行分别存储,那么 Redis 为什么要这么做呢?这么做会造成同一份数据占用两倍空间吗? 五种基本类型之集合对象 Red ...
- JWT令牌简介及demo
一.访问令牌的类型 二.JWT令牌 1.什么是JWT令牌 JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌. JWT的使用场景: 一种情况是webapi,类似之 ...
- 细数JS中实用且强大的操作符&运算符
目录 1,前言 2,代码+应用 2.1,短路运算符 || 2.2,短路运算符 && 2.3,零合并操作符 ?? 2.4,可选链操作符 ?. 2.5,位运算符 & 和 | 2.6 ...
- Django的数据库读写分离
Django的数据库读写分离 1.首先是配置数据库 在settings.py文件中增加多个数据库的配置: DATABASES = { 'default': { 'ENGINE': 'django.db ...
- 洛谷 P4999
题目链接: P4999 烦人的数学作业 题目大意 详见题目 solution 有一个显而易见的结论 发现 \(ans_{l, r} = ans_{1. r} - ans_{1, l - 1}\) 那只 ...