poj1236(强连通缩点)
传送门:Network of Schools
题意:一些学校联接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(A学校支援学校B,并不表示B学校一定支援学校A)。当某校获得一个新软件时,无论是直接获得还是通过网络获得,该校都应立即将这个软件通过网络传送给它应支援的学校。因此,一个新软件若想让所有联接在网络上的学校都能使用,只需将其提供给一些学校即可。第一问:至少需要多少份软件,才能使得所有学校都能拥有软件;第二问:如果只用一份软件,那么需要添加多少条变,使得所有学校都能拥有软件。
分析:一个强连通分量中必定能相互连通,肯定能共享一个软件,因此第一问只需求入度为0的强连通分量个数即可。第二问求需要添加多少条变,使得整个图都成为一个强连通,即任意两个学校都可到达,那么取入度为0的个数a和出度为0的个数b中的最大值,因为强连通分量中必定不会有出度为0或入度为0的点,因此首先用边连接入度和出度为0的点,等其中一个完后再任意连接边把出度为0或入度为0的点补完。
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define LL long long #define mod 100000000 #define inf 0x3f3f3f3f #define eps 1e-6 #define N 110 #define FILL(a,b) (memset(a,b,sizeof(a))) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define PII pair<int,int> using namespace std; struct edge {int v,next;edge(){}edge(int v,int next):v(v),next(next){} }e[N*N]; int n,scc,step,top,tot; int head[N],dfn[N],low[N],belong[N],Stack[N]; int in[N],out[N]; bool instack[N]; void init() {tot=0;step=0;scc=0;top=0;FILL(head,-1);FILL(dfn,0);FILL(low,0);FILL(instack,false);FILL(in,0);FILL(out,0); } void addedge(int u,int v) {e[tot]=edge(v,head[u]);head[u]=tot++; } void tarjan(int u) {int v;dfn[u]=low[u]=++step;Stack[top++]=u;instack[u]=true;for(int i=head[u];~i;i=e[i].next){v=e[i].v;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(instack[v]){low[u]=min(low[u],dfn[v]);}}if(dfn[u]==low[u]){scc++;do{v=Stack[--top];instack[v]=false;belong[v]=scc;}while(v!=u);} } void solve() {for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);if(scc==1){printf("1\n0\n");return;}for(int u=1;u<=n;u++){for(int i=head[u];~i;i=e[i].next){int v=e[i].v;if(belong[v]!=belong[u]){out[belong[u]]++;in[belong[v]]++;}}}int a=0,b=0;for(int i=1;i<=scc;i++){if(!in[i])a++;if(!out[i])b++;}printf("%d\n%d\n",a,max(a,b)); } int main() {int u;while(scanf("%d",&n)>0){init();for(int i=1;i<=n;i++){while(scanf("%d",&u)&&u)addedge(i,u);}solve();} }
View Code
转载于:https://www.cnblogs.com/lienus/p/4278692.html
poj1236(强连通缩点)相关推荐
- Poj 2186 Popular Cows(Tarjan 强连通缩点)
传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解 ...
- BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...
- 2019ICPC(银川) - Delivery Route(强连通缩点+分块最短路)
题目链接:点击查看 题目大意:给出n个点和m条边构成的图,每条边都有权值,其中m1条边是双向的,且权值非负,有m2条边是单向的,且权值可负,现在要求从给定起点st到其他每个点的最短路,若不存在路径则输 ...
- HDU - 4685 Prince and Princess(强连通缩点+二分图完备匹配)
题目链接:点击查看 题目大意:给出n个王子和m个公主,每个王子都有喜欢的公主,题目需要我们在尽可能多的王子可以匹配到喜欢的公主的情况下,求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后, ...
- POJ - 1904 King's Quest(强连通缩点)
题目链接:点击查看 题目大意:给出n个王子和n个公主,每个王子都有喜欢的公主,每个王子初始时都娶到了一位喜欢的公主,题目需要我们求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后,其他的王 ...
- POJ - 1236 Network of Schools(强连通缩点)
题目链接:点击查看 题目大意:一个学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校A支援学校B,并不表示学校B一定支援学校A).当某校获得一个新软件时,无论是 ...
- 有向图缩点:tarjan强连通缩点(模板)
SCC强连通缩点:(用之前记得init) 可以将有向图转换为一个 DAG 图,然后进行拓扑 const int N=1e4+100;const int M=1e5+100;struct Egde {i ...
- 图论--SCC强连通缩点--Tarjan
强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...
- Wikioi 2822爱在心中(强连通缩点+dfs)
2822 爱在心中(强连通缩点+遍历) 2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description " ...
- 队爷的讲学计划 (强连通缩点+最短路)
队爷的讲学计划 [问题描述] 队爷为了造福社会,准备到各地去讲学.他的计划中有n个城市,从u到v可能有一条单向道路,通过这条道路所需费用为q.当队爷在u城市讲学完之后,u城市会派出一名使者与他同行,只 ...
最新文章
- 大流量高并发量网站的之解决方案
- Mysql主从和redis集群哪个好_Redis的三种模式:主从、哨兵、集群
- python使用threading模块实现多线程
- 解析XML的4种方式及优缺点比较
- OpenGL 点光源阴影Point Shadows
- Metrics, tracing 和 logging 的关系
- 【debug】使用lambda在循环中传参时,参数总为同一个值
- 苹果邮箱收发件服务器
- 618期间, “直播带货”翻车负面信息暴增
- BZOJ1823[JSOI2010]满汉全席——2-SAT+tarjan缩点
- [Java] 蓝桥杯ADV-175 算法提高 三个整数的排序
- python读取配置文件 分段_python配置文件读取
- C++编程语言中创建类的对象(类的初始化)的方法
- 常用制图工具Visio-ProcessOn
- x200装linux驱动下载,佳能 ThinkPad X200 Tablet 驱动程序下载-更新佳能软件(平板电脑)...
- UMD算法讲义——Lecture 2:算法设计:稳定婚姻问题
- 使用GCD 转自 Posted by 唐巧
- 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题
- 无穷小进课堂,历史在召唤
- Linux系统编程 50 -stat和stat函数 穿透和非穿透