题目链接:https://www.luogu.org/problemnew/show/P2812

注意:判断出入度是否为0的时候枚举只需到颜色的数量。

坑点:当只有一个强连通分量时,不需要再添加新边。即子任务B ans = 0。

子任务B证明:若每个点都相连通,出入度都必须为1。

保证所有点的出入度都>1就OK。

所以需要找一下出度为0和入度为0的点再取一个max即可。

#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 10;
struct edge{
int from, to, next;
}e[maxn<<2];
int head[maxn], cnt;
bool vis[maxn];
int n, dfn[maxn], low[maxn], tim, color[maxn], num, chudu[maxn], rudu[maxn], runum, chunum; stack<int> s;
void add(int u, int v)
{
e[++cnt].from = u;
e[cnt].next = head[u];
e[cnt].to = v;
head[u] = cnt;
}
void tarjan(int x)
{
dfn[x] = low[x] = ++tim;
s.push(x); vis[x] = 1;
for(int i = head[x]; i != -1; i = e[i].next)
{
int v = e[i].to;
if(!dfn[v])
{
tarjan(v);
low[x] = min(low[x], low[v]);
}
else if(vis[v])
{
low[x] = min(low[x], low[v]);
}
}
if(dfn[x] == low[x])
{
color[x] = ++num;
vis[x] = 0;
while(s.top() != x)
{
color[s.top()] = num;
vis[s.top()] = 0;
s.pop();
}
s.pop();
}
}
int main()
{
int m;
memset(head, -1, sizeof(head));
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
int u;
while(scanf("%d",&u) && u != 0)
add(i, u);
}
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 = e[j].next)
{
int v = e[j].to;
if(color[v] != color[i])
{
chudu[color[i]]++;
rudu[color[v]]++;
}
}
for(int i = 1; i <= num; i++)
{
if(!rudu[i]) runum++;
if(!chudu[i]) chunum++;
}
for(int i = 2; i <= n; i++)
{
if(color[i] != color[i-1])
{
printf("%d\n%d",runum, max(runum, chunum));
return 0;
}
}
printf("%d\n%d",runum,0);
return 0;
}

最新文章

  1. response.sendRedirect的细节
  2. 二叉树的建立与递归遍历C语言版
  3. hiho_1138_island_travel
  4. OnItemSelectedListener事件与二级联动
  5. FlashBuilder(FB/eclipse) 打开多个无效
  6. ThinkPHP5中Session的使用
  7. Protel封装库
  8. Alternating Current
  9. C#&amp;Sql获取中文字符拼音首字母的方法
  10. java.lang.OutOfMemoryError: GC overhead limit exceeded 问题分析和解决(转)
  11. java 多态 ---父类调用子类方法
  12. ●BZOJ 4559 [JLoi2016]成绩比较
  13. window C/C++ 简单的IDE编译器
  14. Task 的用法
  15. win10 1803版本unable to start ssh-agent service, error :1058
  16. 常用Linux VPS/服务器SSH连接工具 - Xshell下载与使用
  17. BAT:通过连接符处理判断OR的关系
  18. 【ML入门系列】(三)监督学习和无监督学习
  19. 更改ORACLE归档路径及归档模式
  20. ESAPI学习笔记

热门文章

  1. 信号和槽:Qt中最差劲的创造
  2. Whu 1604——Play Apple——————【博弈】
  3. 经典算法详解(1)斐波那契数列的n项
  4. JS &amp;&amp; || 陷阱 javascript 逻辑与、逻辑或 【转】
  5. Vue表格中,对数据进行转换、处理
  6. 区域可编辑contenteditable的问题总结
  7. vuejs的双向数据绑定实现原理——object.defineproperty()
  8. ArcGIS图框生成和批量打印工具 5.2支持国家2000坐标系,支持ArcGIS10.1、ArcGIS10.2,输出图片可以是TIF和JPG
  9. 转:如何利用已有的切片文件生成TPK
  10. Android Activity中状态保存机制