USACO network of school 强连通分量
这个题的意思是有一个有向图, 每个顶点可以发送软件到与其相连的顶点上, 现在问1,至少发送给几个顶点能满足所有顶点都收到软件, 2:如果想让这个图变成强连通图,至少添几条边。 特例是给定的图是一个强连通图的话答案是1, 0. 一般情况下我们先将这个图的强连通分量求出来缩成一个点然后统计入度为0的点和出度为0的点的个数, 答案一就是入度为0的点的个数, 答案就是他们两个之间的最大值。代码如下:
/*ID: m1500293LANG: C++PROG: schlnet */ #include <cstdio> #include <cstring> #include <algorithm> #include <vector>using namespace std; const int max_v = 120;struct Scc {int V; //图的顶点数vector<int> G[max_v]; //原始图vector<int> rG[max_v]; //反向边的图vector<int> vs; //后序遍历顶点列表bool used[max_v]; //访问标记int cmp[max_v]; //所属强连通分量的拓扑排序void init(){for(int i=0; i<=V; i++) G[i].clear(), rG[i].clear();}void add_edge(int from, int to){G[from].push_back(to);rG[to].push_back(from);}void dfs(int v){used[v] = true;for(int i=0; i<G[v].size(); i++)if(!used[G[v][i]]) dfs(G[v][i]);vs.push_back(v);}void rdfs(int v, int k){used[v] = true;cmp[v] = k;for(int i=0; i<rG[v].size(); i++)if(!used[rG[v][i]]) rdfs(rG[v][i], k);}int scc(){memset(used, 0, sizeof(used));vs.clear();for(int v=1; v<=V; v++)if(!used[v]) dfs(v);memset(used, 0, sizeof(used));int k = 1;for(int i=vs.size()-1; i>=0; i--)if(!used[vs[i]]) rdfs(vs[i], k++);return k-1;} }ss; int num; //强连通分量的个数 int in[110], out[110]; int main() {freopen("schlnet.in", "r", stdin);freopen("schlnet.out", "w", stdout);int N;scanf("%d", &N);ss.V = N;ss.init();for(int i=1; i<=N; i++){int t;scanf("%d", &t);while(t != 0){ss.add_edge(i, t);scanf("%d", &t);}} // printf("%d\n", ss.scc());num = ss.scc();if(num == 1){printf("1\n0\n");return 0;}for(int u=1; u<=N; u++) //u->vfor(int j=0; j<ss.G[u].size(); j++){int v = ss.G[u][j];int uu=ss.cmp[u], vv=ss.cmp[v];if(uu != vv){in[vv]++;out[uu]++;}}int in_0_num=0, out_0_num=0;for(int i=1; i<=num; i++){if(!in[i]) in_0_num++;if(!out[i]) out_0_num++;}printf("%d\n%d\n", in_0_num, max(in_0_num, out_0_num));return 0; }
转载于:https://www.cnblogs.com/xingxing1024/p/5180641.html
USACO network of school 强连通分量相关推荐
- POJ 1236 Network of Schools(强连通分量缩点求根节点和叶子节点的个数)
Description: A number of schools are connected to a computer network. Agreements have been developed ...
- 【缩点】解题报告:luogu P2746 [USACO5.3]校园网Network of Schools(有向图、强连通分量、缩点)
题目链接:P2746 [USACO5.3]校园网Network of Schools 用tarjan算法求出强连通分量,并且缩点,如果缩点后只有一个点,则答案为1,0 对于第一问,如果缩点后某一点的入 ...
- 图论复习——dfs树,点双,边双,强连通分量
知识点 dfs树 对一个图运行 dfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根. 无向图的 dfs树 没有横叉边. 有向图的 dfs树 横叉边方向唯一,总是从后访问的点 ...
- POJ1236Network of Schools——强连通分量缩点建图
[题目描述] A number of schools are connected to a computer network. Agreements have been developed among ...
- 图(八):强连通分量
强连通分量 强连通分量是针对有向图来说的,当一个有向图中所有的点都能够相互到达则称这个图为强连通分量. 一.模板 int dfn[N], low[N], dfncnt, s[N], in_stack[ ...
- 强连通分量(超详细!!!)
一.定义 在有向图G中,如果两个顶点u,v间有一条从u到v的有向路径,同时还有一条从v到u的有向路径,则称两个顶点强连通.如果有向图G的每两个顶点都强连通,称G是一个强连通图.有向非强连通图的极大强连 ...
- 【C++】强连通分量
强连通分量 先来一题例题 题目大意 怎么做? 分析 结论 不要高兴得太早 怎么办呢? 定义 缩点法 原图构建新图 发现 新的结论 强连通分量算法 Kosaraju算法 Tarjan算法 例题:信息传递 ...
- 图论学习-有向图强连通分量
文章目录 有向图强连通分量 1.定义: 2.基本术语与概念 2.1 边的概念 2.2 缩点 2.3 时间戳 3. tarjan求强连通分量(SCC) 3.1 原理 3.2 步骤 3.3 模板 3.3. ...
- 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会
先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...
最新文章
- CV竞赛项目研究:脊柱疾病诊断(天池,GPU赛道,2020年9月)
- 安装VMwareTools后虚拟机中的鼠标滚轮无法使用解决办法
- SQL 四种连接:内连接、左外连接、右外连接、全连接--转载
- Python+Django+Ansible Playbook自动化运维项目实战:资产管理
- lucene造成磁盘空间不足的问题
- Linux uname命令
- 并行开发 5.同步机制(下)
- axios的this指向_vue使用axios时this指向哪里
- 怎样使用css动画animation实现静态箭头图片上下摆动
- linux firefox flashplayer 升级,在deepin中更新火狐浏览器firefox和firefox-flashplayer的方法...
- 足浴按摩预约下单小程序开发制作功能介绍
- 为Web登陆添加验证码功能
- 什么是企业移动化?以及企业移动化的4大特征
- 【图文教程】Shell基础知识
- 码支付系统 无授权—个人免签约支付系统二维码收款即时到账源码 –
- 钕铁硼NdFeB材料各类牌号磁特性大全
- 最新《IT营Angular5 Angular4.X入门实战》
- 初等数论 课堂笔记 第三章 -- 保密通讯与公开密钥
- VS1053B 音频编解码器芯片的介绍(二)
- 【无标题】3ds max 室内设计后期PS调整