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 ...
随机推荐
- 【MYSQL】win7安装mysql-5.7.10绿色版
1.下载 :mysql下载地址 2.解压缩 3.环境变量配置 MYSQL_HOME=D:\mysql-5.7.11-win32 PATH=%MYSQL_HOME%\bin 4.修改配置文件 a.)将m ...
- Loadrunner录制脚本与编写脚本的区别
异同点: 1.录制的和编写的脚本质量上没有区别 2.性能脚本关心的是用户和服务器的数据交互,从这点上来看,录制和编写也没有区别,手动编写脚本也可以写出很真实的脚本 3.能录制的情况下,就录制吧,谁每天 ...
- ctfhub技能树—彩蛋
彩蛋题建议大家首先自己动手去找一找 做 好 准 备 后 再 看 下 文 ! 1.首页 使用域名查询工具查询子域名 2.公众号 此题关注ctfhub公众号即可拿到,不过多赘述. 3. ...
- 为什么会有 AtomicReference ?
我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 我们之前了解过了 AtomicInteger.Ato ...
- VBA调用数独求解器
我开发了一个用于求解数独的dll文件,只需要双击一下注册表文件,就可以在VBA中调用这个功能了.具体步骤如下: 下载:https://share.weiyun.com/5dpcNqx 找到ExcelS ...
- 接收的参数为日期类型、controller控制层进行数据保存、进行重定向跳转
目录 1.接收的参数为日期类型 2.controller控制层进行数据保存 3.controller层如何进行重定向跳转(因为默认是请求转发) 4.静态资源的映射 1.接收的参数为日期类型 WEB-I ...
- Markdown里常用的HTML元素
转义:\ 换行:<br/> 红色文字:<font color=#FF0000>字体改成红色了</font> A标签 新窗口:<a href="xxx ...
- (15)-Python3之--configparser模块
1.模块简介 configparser模块是python用来读取配置文件的模块,置文件的格式跟windows下的ini或conf配置文件相似,可以包含一个或多个节(section), 每个节可以有多个 ...
- Linux中LPC、RPC、IPC的区别
其实这玩意儿就是纸老虎,将英文缩写翻译为中文就明白一半了. IPC:(Inter Process Communication )跨进程通信 这个概念泛指进程之间任何形式的通信行为,是个可以拿来到处套的 ...
- Python学习【第2篇】:循环
For循环 pass while 循环 pass 练习题: 1.使用while循环输入 1 2 3 4 5 6 8 9 10,不输出7 n = 1while n< 11: if n == ...