题意:

      一些学校有一个发送消息的体系,现在给你一些可以直接发送消息的一些关系(单向)然后有两个问题

(1) 问你至少向多少个学校发送消息可以让所有的学校都得到消息

(2) 问至少加多少条边可以让所有学校达到消息互通(变成强连通图)

思路:

      比较简单了,我们先强连通所点,然后对于第一个问题,我们只要输出入度为0的个数,这个很好理解,对于第二个问题,我们可以输出max(入度为0的个数,出度为0的个数),这样做是因为我们可以吧度数大的先用小的补充上,剩下的就随意补充就行了,还有就是记得只有一个联通分量的时候特判一下,

PS :假如这个题目要是让输出解决方案的话也比较好弄,对于第一个,每个入度为0的点给一个,每个强连通分量《元素个数大于1的》给一个就行了。对于第二个,就是先用小的填充大的,剩下的零头随意安排。


#include<stdio.h>
#include<string.h>
#include<stack> #define N_node 100 + 10
#define N_edge 10000 + 100 using namespace std; typedef struct
{
int to ,next;
}STAR; typedef struct
{
int a ,b;
}EDGE; EDGE edge[N_edge];
STAR E1[N_edge] ,E2[N_edge];
int list1[N_node] ,list2[N_node] ,tot;
int Belong[N_node] ,Cnt;
int mark[N_node];
stack<int>sk; void add(int a ,int b)
{
E1[++tot].to = b;
E1[tot].next = list1[a];
list1[a] = tot; E2[tot].to = a;
E2[tot].next = list2[b];
list2[b] = tot;
} void DFS1(int s)
{
mark[s] = 1;
for(int k = list1[s] ;k ;k = E1[k].next)
{
int to = E1[k].to;
if(mark[to]) continue;
mark[to] = 1;
DFS1(to);
}
sk.push(s);
} void DFS2(int s)
{
mark[s] = 1;
Belong[s] = Cnt;
for(int k = list2[s] ;k ;k = E2[k].next)
{
int to = E2[k].to;
if(mark[to]) continue;
mark[to] =1;
DFS2(to);
}
} int main ()
{
int n ,i ,j ,a;
while(~scanf("%d" ,&n))
{
memset(list1 ,0 ,sizeof(list1));
memset(list2 ,0 ,sizeof(list2));
tot = 1;
int nowid = 0;
for(i = 1 ;i <= n ;i ++)
{
while(scanf("%d" ,&a) && a)
{
add(i ,a);
edge[++nowid].a = i;
edge[nowid].b = a;
}
}
memset(mark ,0 ,sizeof(mark));
while(!sk.empty()) sk.pop();
for(i = 1 ;i <= n ;i ++)
{
if(!mark[i]) DFS1(i);
}
Cnt = 0;
memset(mark ,0 ,sizeof(mark));
while(!sk.empty())
{
int xin = sk.top();
sk.pop();
if(mark[xin]) continue;
Cnt ++;
DFS2(xin);
}
int d1[N_node] = {0};
int d2[N_node] = {0};
for(i = 1 ;i <= nowid ;i ++)
{
int a = Belong[edge[i].a];
int b = Belong[edge[i].b];
if(a == b) continue;
d1[a] ++ ,d2[b] ++;
}
int sum1 = 0 ,sum2 = 0;
for(i = 1 ;i <= Cnt ;i ++)
{
if(!d1[i]) sum1 ++;
if(!d2[i]) sum2 ++;
}
if(Cnt == 1)
{
printf("1\n0\n");
continue;
}
printf("%d\n" ,sum2);
sum1 > sum2 ? printf("%d\n" ,sum1) : printf("%d\n" ,sum2);
}
return 0;
}

POJ1236 强连通 (缩点后度数的应用)的更多相关文章

  1. poj1236强连通缩点

    题意:给出每个学校的list 代表该学校能链接的其他学校,问1:至少给几个学校资源使所有学校都得到:2:至少加多少个边能让所有学校相互连通: 思路:1:找出缩点后入度为零的点个数  2:找出缩点后入度 ...

  2. poj1236 强连通缩点

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15211   Accepted: 60 ...

  3. POJ 1236 学校传数据 强连通+缩点+DAG

    题意描述: 网络中有一些学校,每个学校可以分发软件给其他学校.可以向哪个分发取决于他们各自维护的一个清单. 两个问题 1:至少要copy多少份新软件给那些学校, 才能使得每个学校都能得到. 2:要在所 ...

  4. poj2186 强连通缩点

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29773   Accepted: 12080 De ...

  5. HDU5934 Bomb(2016杭州CCPC第二题)(强连通缩点)

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. poj1236 强连通

    题意:有 n 个学校每个学校可以将自己的软件共享给其他一些学校,首先,询问至少将软件派发给多少学校能够使软件传播到所有学校,其次,询问添加多少学校共享关系可以使所有学校的软件能够相互传达. 首先,第一 ...

  7. HDU-4635 Strongly connected 强连通,缩点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给一个简单有向图(无重边,无自环),要你加最多的边,使得图还是简单有向图... 先判断图是 ...

  8. poj 3177 Redundant Paths【求最少添加多少条边可以使图变成双连通图】【缩点后求入度为1的点个数】

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11047   Accepted: 4725 ...

  9. poj1236 SCC+缩点

    /* 强连通分量内的点可以互相传送,可以直接缩点 缩点后得到一棵树 第一问的答案是零入度点数量, 第二问: 加多少边后变成强连通图 树上入度为0的点有p个,出度为0的点为q,那么答案就是max(p,q ...

随机推荐

  1. 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位

    剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...

  2. 人脸识别分析小Demo

    人脸识别分析 调用 腾讯AI人脸识别接口 测试应用 纯py文件测试照片 # -*- coding: utf-8 -*- import json from tencentcloud.common imp ...

  3. [同步到 MaixPy3 文档] 使用 Python 编程入门开源硬件项目

    本文是给有一点 Python 基础但还想进一步深入的同学,有经验的开发者建议跳过. 前言 在写这篇案例系列的时候 junhuanchen 期望能够引导用户如何成为专业的开发者,不是只会调用代码就好,所 ...

  4. IDEA中便捷内存数据库H2的最简使用方式

    在IDEA中有时候为了练习,需要使用到数据库,但如果自己工作或开发机子上本来没有安装数据库,也没有可用的远程数据库时,我们可以直接在IDEA环境上使用便捷式的内存数据库H2,关于H2更多知识就自己去找 ...

  5. MySQL基础知识:Character Set和Collation

    A character set is a set of symbols and encodings. A collation is a set of rules for comparing chara ...

  6. 关于asyncio知识一

    一.介绍 asyncio 是python3.4 引入的一个新的并发模块,主要通过使用coroutines 和 futures 来让我们更容易的去实现异步的功能,并且几乎和写同步代码一样的写代码,还没有 ...

  7. Java并发编程之基础理论

    内存模型   主内存.工作内存与Java堆.栈.方法区并不是同一个层次的内存划分 勉强对应起来 从定义来看,主内存对应Java堆中对象实例数据部分,工作内存对应虚拟机栈中部分区域 从更低层次来说,主内 ...

  8. teprunner测试平台用例前置模块开发

    本文开发内容 现在正式进入测试相关功能开发.teprunner测试平台底层是pytest,中间层是tep,还没了解的朋友可以先看看tep的文章,整个平台的设计思路和后面用例的执行都会基于这个工具.te ...

  9. 从本质彻底精通Git——4个模型1个周期1个史观1个工作流

    一.什么是Git? Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是Linus Torvalds为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软 ...

  10. 【linux】系统编程-3-system-V IPC 信号量

    目录 前言 5. 信号量 5.1 概念 5.2 工作原理 5.3 操作函数 5.3.1 semget() 5.3.2 semop() 5.3.3 semctl() 5.4 例程 参考: 前言 原文链接 ...