题意:有N个学校,从每个学校都能从一个单向网络到另外一个学校。
1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。
2:至少需要添加几条边,使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。

解题关键:1、缩点之后求出入度为0的点的个数;

     2、缩点之后入度为0点和出度为0点的个数的max,(因为是任意点可到达全图),若存在点到达全图,添加入度-1条边即可。

注意特判只有一个节点的情况。

dfn需要初始化

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
#define MAXN 120
#define MAXM 100010
struct edge{
int to,nxt;
}e[MAXM];
int degree1[MAXN],degree2[MAXN];
int head[MAXN],st[MAXN],dfn[MAXN],lowest[MAXN],belong[MAXN];
bool inst[MAXN];
int n,scnt,top,tot;//scnt从1开始
void init(){
memset(head,-,sizeof head);
memset(degree1,,sizeof degree1);
memset(degree2,,sizeof degree2);
scnt=top=tot=;
} void add_edge(int u, int v){
e[tot].to=v;
e[tot].nxt=head[u];
head[u]=tot++;
} void Tarjan(int u){
dfn[u]=lowest[u]=++tot;
inst[u]=;
st[top++]=u;
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
Tarjan(v);
lowest[u]=min(lowest[u],lowest[v]);
}
else if(inst[v]){
lowest[u]=min(lowest[u],dfn[v]);//也可用lowest
}
}
if(dfn[u]==lowest[u]){
scnt++;
int t;
do{
t=st[--top];
inst[t]=false;
belong[t]=scnt;
}while(t!=u);
}
} void solve(){//缩点
for(int i=;i<=n;i++) if(!dfn[i]) Tarjan(i);
for(int i=;i<=n;i++){
for(int j=head[i];j!=-;j=e[j].nxt){
if(belong[i]!=belong[e[j].to]){
degree1[belong[i]]++,degree2[belong[e[j].to]]++;
}
}
}
int sum1=,sum2=;
for(int i=;i<=scnt;i++){
if(!degree1[i]) sum1++;
if(!degree2[i]) sum2++;
}
if(scnt==){//1个节点进行特判
printf("1\n0\n");
return;
}
printf("%d\n",sum2);
printf("%d\n",max(sum1,sum2));
return;
} int main(){
int a;
while(scanf("%d",&n)!=EOF){
init();
int m=;
while(scanf("%d",&a)){
if(a==){
m++;
if(m>n) break;
continue;
}
add_edge(m,a);
}
solve();
}
return ;
}

最新文章

  1. vim 编辑
  2. jQuery取得select选中的值
  3. Git merge 与 git rebase的区别
  4. Flex ObjectHandles 构建绘图程序!
  5. Programming with gtkmm 3
  6. 一种少见的跨目录写webshell方法
  7. Docker-创建一个mysql容器,并保存为本地镜像
  8. ViewPager介绍和使用说明
  9. linux - 文本处理 及 正则表达式
  10. 域名的a记录转过来他的公网ip
  11. NFC手机
  12. Linux平台ORACLE INSTANT客户端安装
  13. [JSOI2008]最大数
  14. 使用FluentScheduler和IIS预加载在asp.net中实现定时任务管理
  15. [Swift]LeetCode395. 至少有K个重复字符的最长子串 | Longest Substring with At Least K Repeating Characters
  16. linux的使用以及linux服务器应用的部署
  17. GUI学习之八——QToolButton的学习总结
  18. 通过this()调用有参构造方法
  19. Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)
  20. .net Core Abp See config settings - &quot;CustomSchemaIds&quot; for a workaround

热门文章

  1. EF Core 日志跟踪sql语句
  2. ASP.NET动态网站制作(11)-- JQ(3)
  3. java jdbc 同时操作查询删除操作
  4. Node.js面试题
  5. mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案
  6. PYTHON调用C接口(基于Ctypes)实现stein算法最大公约数的计算
  7. PAT 甲级 1104. Sum of Number Segments (20) 【数学】
  8. mooc_java 集合框架下
  9. 分享知识-快乐自己:JAVA中的 Iterator 和 Iterable 区别
  10. tensorflow knn 预测房价 注意有 Min-Max Scaling