//题意:
//给你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. Java进阶专题(二十一) 消息中间件架构体系(3)-- Kafka研究

    前言 Kafka 是一款分布式消息发布和订阅系统,具有高性能.高吞吐量的特点而被广泛应用与大数据传输场景.它是由 LinkedIn 公司开发,使用 Scala 语言编写,之后成为 Apache 基金会 ...

  2. thinkpad8平板安装win10系统

    ThinkPad8 因为是平板电脑,只有一个micro USB接口,常规安装没法使用鼠标或键盘进行输入,所以难倒很多人. 幸好前段时间买了根otg线和3.0usb hub,安装方法记录如下: 准备:U ...

  3. 记一次使用logmnr查找操作人流程

    经常遇到开发的需求,帮我查一下是谁修改了表里面的记录,是谁对表进行了DDL操作,此类问题可以使用logmnr解决 1.根据操作时间定位归档日志 SELECT name FROM V$ARCHIVED_ ...

  4. 力软最新版本与.netCore版本

    功能强大,直接上图: 加微信或QQ交流开发技术:25489181 netcore版本 版本优势: .NET Core是适用于 Windows.Linux 和 macOS 的免费.开源托管的计算机软件框 ...

  5. luogu P4116 Qtree3

    题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...

  6. 【MYSQL】DDL语句

    介绍:DDL语句,即数据定义语句,定义了不同的数据段,数据库表.表.列.索引等数据库对象:例如,create.drop.alter 适用对象:一般是由数据库管理员DBA使用 1.连接数据库 mysql ...

  7. dotnet cli 5.0 新特性——dotnet tool search

    dotnet cli 5.0 新特性--dotnet tool search Intro .NET 5.0 SDK 的发布,给 dotnet cli 引入了一个新的特性,dotnet tool sea ...

  8. 转 12 jmeter性能测试实战--web程序

    12 jmeter性能测试实战--web程序   项目背景 项目:XX网站环境:Windows需求:并发登录的性能测试场景:1s增加2个线程,运行2000次(线程数20,Ramp-Up seconds ...

  9. JavaScript常用API

    JavaScript常用API 节点属性 文档节点 事件监听.一出事件 获取元素方法

  10. 前端面试之HTML5的新变化

    前端面试之HTML5的新变化 H5新增语义化标签 头部标签 <header> :头部标签 <nav> :导航标签 <article> :内容标签 <secti ...