题目链接:http://poj.org/problem?id=1236

题意:给定一个表示n所学校网络连通关系的有向图。现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u接收到。

现要求解两个问题:

TaskA: 最少分发给几个学校,就可以使所有的学校都能得到软件。

TaskB: 最少增加几条边,就可以使得,发软件给任一学校,所有学校都可以收到。

思路:先进行强联通分量分解,然后缩点,并计算缩点后每个点的出度、入度。入度为0的点的总数为 a ,出度为0的点总数为 b。a即TaskA的答案,而TaskB的答案为max(a, b)。

求SCC部分参考了 http://blog.csdn.net/dgq8211/article/details/7834292

缩点的做法很暴力,将每个强联通分量重新编号为一个集合,在求SCC时记录belong。

 #include <cstdio>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;
const int MAX_N = ; int n;
vector<int> G[MAX_N];
stack<int> S;
int clock;
int scc;
int dfn[MAX_N], low[MAX_N];
int inStack[MAX_N];
int belong[MAX_N];
int indeg[MAX_N];//scc的
int outdeg[MAX_N]; void init(){
scc = ;
clock = ;
memset(dfn, , sizeof(dfn));
memset(low, , sizeof(low));
memset(inStack, , sizeof(inStack));
memset(indeg, , sizeof(indeg));
memset(outdeg, , sizeof(outdeg));
} void tarjan(int u){
dfn[u] = low[u] = ++clock;
S.push(u);
inStack[u] = ;
for(int i=; i<G[u].size(); i++){
int v = G[u][i];
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]){
int v;
do{
v = S.top();
S.pop();
inStack[v] = ;
belong[v] = scc;
//printf("%d ", v);
}while(v != u);
scc++;
}
} int main()
{
freopen("1236.txt", "r", stdin);
scanf("%d", &n);
for(int i=; i<=n; i++){
int u;
while(scanf("%d", &u) && u){
G[i].push_back(u);
//outdeg[i]++;
//indeg[u]++;
}
}
init();
for(int i=; i<=n; i++){//遍历所有点
if(!dfn[i]){//未被发现的点
tarjan(i);
}
}
int a = ;
int b = ; for(int i=; i<=n; i++){//缩点
for(int j=; j<G[i].size(); j++){
int u = G[i][j];
if(belong[i] != belong[u]){
outdeg[belong[i]]++;
indeg[belong[u]]++;
}
}
} for(int i=; i<scc; i++){
if(indeg[i] == ) a++;
if(outdeg[i] == ) b++;
} b = max(a, b);
if(scc == ) b = ;
printf("%d\n%d\n", a, b);
return ;
}

最新文章

  1. 对html与body的一些研究与理解
  2. Eclipse 实现关键字自动补全功能
  3. R语言实战(三)基本图形与基本统计分析
  4. SQL入门经典(四)之创建和修改数据表
  5. JS高程2.在HTML中使用Javascript(1)
  6. Window环境下搭建MyEclipse+Tomcat+MAVEN+SVN
  7. 同步推是如何给未越狱的IOS设备安装任意IPA的?
  8. ios常用的一些类库
  9. 求fibonacci数列 java
  10. Java:Date、Calendar、Timestamp的区别、相互转换与使用【转载】
  11. C# 反射相关的东西
  12. 与我们息息相关的internet服务(1)---域名服务
  13. Spring Boot 中的静态资源到底要放在哪里?
  14. PHP-MySQL基本操作
  15. 2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)
  16. ActiveMQ 的安装与使用
  17. 获取当前操作系统的ip
  18. pygame游戏开发入门例子
  19. html5-基本知识小结及补充
  20. VS本地调试 Visual Studio远程调试监视器(MSVSMON.EXE)的32位版本不能用于调试64位进程或64位转储

热门文章

  1. 在O(1)时间内删除单链表结点
  2. mips平台使用jdbc操作sqlite的最终解决方案
  3. UITableView使用总结和性能优化
  4. 用Visual Studio2010 编译 C++文件&quot;hello world”
  5. 修改tomcat访问路径
  6. python- 迭代器与生成器
  7. 引用System.Runtime.Serialization.Json
  8. 函数内部用setTimeout()调用自身函数相当于setInterval()
  9. python re 正则
  10. studio中集成.so文件的两种方式