题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1051

题解:缩点之后判断出度为0的有几个,只有一个那么输出那个强连通块的点数,否者就输出0

#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
using namespace std;
const int N = 1e6 + 10;
const int M = 5e6 + 10;
map<int,int>mmp[N];
struct TnT {
int v, next;
}edge[M];
int head[N], e;
int Low[N], DFN[N], Stack[N], Belong[N], num[N];
int Index, top, scc;
int Out[N];
bool Instack[N];
void init() {
memset(head, -1, sizeof(head));
e = 0;
}
void add(int u, int v) {
edge[e].v = v;
edge[e].next = head[u];
head[u] = e++;
}
void Tarjan(int u) {
int v;
Low[u] = DFN[u] = ++Index;
Stack[top++] = u;
Instack[u] = true;
for(int i = head[u]; i != -1; i = edge[i].next) {
v = edge[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;
num[scc]++;
} while(v != u);
}
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
init();
for(int i = 0; i < m; i++) {
int a, b;
scanf("%d%d", &a, &b);
if(mmp[a][b] != 1) {
mmp[a][b] = 1;
add(a , b);
}
}
memset(DFN, 0, sizeof(DFN));
memset(Low, 0, sizeof(Low));
memset(Instack, false, sizeof(Instack));
memset(num, 0, sizeof(num));
for(int i = 1; i <= n; i++) {
if(!DFN[i]) Tarjan(i);
}
for(int i = 1; i <= n; i++) {
for(int j = head[i]; j != -1; j = edge[j].next) {
int v = edge[j].v;
if(Belong[i] != Belong[v]) Out[Belong[i]]++;
}
}
int ans = 0 , pos = -1;
for(int i = 1; i <= scc; i++) {
if(Out[i] == 0) {ans++, pos = i;}
}
if(ans > 1) printf("0\n");
else printf("%d\n" , num[pos]);
return 0;
}

最新文章

  1. jqGrid实现当前页列合计与总计
  2. 读书摘要,Hackable Projects
  3. 使用-MM生成include指令和依赖生成(make include directive and dependency generation with -MM)
  4. Git教程学习(五)
  5. C# 结构体
  6. SQL Server 的SQL基础知识
  7. golang.org/x/mobile/exp/gl/glutil/glimage.go 源码分析
  8. [转]Linux read用法
  9. How Tomcat Works(六)
  10. 动态网页技术---JSP
  11. 4 C#和Java 的比较
  12. 【转】Windows环境下.NET 操作Oracle问题
  13. Python中Celery 的基本用法以及Django 结合 Celery 的使用和实时监控进程
  14. 【性能提升神器】Covering Indexes
  15. Java并发编程笔记之基础总结(一)
  16. 【第196期】Drupal7 Features模块与 Drupal8 Configuration Management 模块对比
  17. c# 操作文本文件
  18. 2018.11.07 NOIP训练 L的鞋子(权值分块+莫队)
  19. Kubernetes中的资源调度与资源管理
  20. git 忽略不提交的文件3种情形

热门文章

  1. 泥瓦匠 5 年 Java 的成长感悟(下)
  2. hdoj 4715 Difference Between Primes 素数筛选+二分查找
  3. 自练Eclipse搭建SSH全自动注解博客项目笔记
  4. 洛谷P1510 题解
  5. 【Java例题】2.2 分数类
  6. SpringBoot 集成Jedis操作set
  7. leetcode 29 两数相除
  8. java并发编程(十一)----(JUC原子类)基本类型介绍
  9. Linux常用命令之压缩解压
  10. TensorFlow Data模块