poj2186tarjan算法缩点求出度

自己打一遍第一题,入门啦,入门啦

题目还算简单,多头牛,给你仰慕关系(可传递),问你最后有没有牛被所有的牛仰慕

根据关系可以建图,利用tarjan算法缩点处理后,得到有向无环图,缩成的点都是相互仰慕的,所以根据传递性也就是可以看成一个点了,然后染色分块,计算每一块的出度。

如果出度为0有且仅有一个,那么输出该块内所有的点,都符合要求

如果有多个直接输出0即可

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int maxn = 10005;
const int maxm = 100005;
struct node{
int to,pre;
}e[maxm];
int n,m;
int idx;
int id[maxn],cnt;
int dfn[maxn],low[maxn];
int stack1[maxn],s_top;
int out[maxn];
int color[maxn];
int vis[maxn];
int cut_point = 0;
void init()
{
memset(dfn,0,sizeof(dfn));
memset(vis,0,sizeof(vis));
memset(color,0,sizeof(color));
memset(low,0,sizeof(low));
memset(id,-1,sizeof(id));
memset(out,0,sizeof(id));
cnt = 0;
idx = 0;
s_top = 0;
cut_point = 0;
}
void add(int u,int v)
{
e[cnt].to = v;
e[cnt].pre = id[u];
id[u] = cnt++;
}
void tarjan(int u, int pre)
{
dfn[u] = low[u] = ++idx;
vis[u] = 1;
stack1[s_top++] = u; for(int i = id[u];~i;i = e[i].pre)
{
int v = e[i].to;
if(!vis[v])
{
tarjan(v,u);
low[u] = min(low[v],low[u]);
}
else
{
low[u] = min(low[u],dfn[v]);
}
}
if(low[u] == dfn[u])
{
cut_point++;//颜色1 。。。n
while(s_top > 0 && stack1[s_top] != u)//目的是先处理完元素在判断是不是最后一个
{
s_top--;
vis[stack1[s_top]] = 2;
color[stack1[s_top]] = cut_point;
}
}
} int main()
{
int u,v;
while(~scanf("%d%d",&n,&m))
{
//初始化
init();
//添加边
for(int i = 0;i < m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
}
//缩点处理——染色
for(int i = 1;i <= n;i++)//防止不连通的情况
{
if(!vis[i])
{
tarjan(i,-1);
}
}
//染色成功后,记录出度
for(int i = 1;i <= n;i++)
{
for(int j = id[i];~j;j = e[j].pre)
{
int v = e[j].to;
if(color[i] != color[v])
{
++out[color[i]];
}
}
}
//看看度为0的点的集合,找出所有的点
//color还要一样,不能有两个
int sum = 0,p_color;
for(int i = 1;i <= cut_point;i++)
{
if(!out[i])
sum++,p_color = i;
} if(sum == 1)
{
int ans = 0;
for(int i = 1;i <= n;i++)
{
if(color[i] == p_color)ans++;
}
printf("%d\n",ans);
}
else
{
puts("0");
}
}
return 0;
}

poj2186tarjan算法缩点求出度的更多相关文章

  1. POJ 1236 Network Of Schools (强连通分量缩点求出度为0的和入度为0的分量个数)

    Network of Schools A number of schools are connected to a computer network. Agreements have been dev ...

  2. tarjan算法+缩点--cojs 908. 校园网

    cojs 908. 校园网 ★★   输入文件:schlnet.in   输出文件:schlnet.out   简单对比时间限制:1 s   内存限制:128 MB USACO/schlnet(译 b ...

  3. tarjan 缩点 求 scc

    算法学自 BYVoid https://www.byvoid.com/zhs/blog/scc-tarjan/ 这个写得很清楚了 当然 你可能不这么认为 而且 如果是让我 一开始就从这个博客 学 ta ...

  4. POJ - 2553 tarjan算法+缩点

    题意: 给你n个点,和m条单向边,问你有多少点满足(G)={v∈V|∀w∈V:(v→w)⇒(w→v)}关系,并把这些点输出(要注意的是这个关系中是蕴含关系而不是且(&&)关系) 题解: ...

  5. E - Redundant Paths - poj 3177(缩点求叶子节点)

    题意:给一个图,想让每两个点之间都有两条路相连,不过特殊的是相同的两点之间多次相连被认为是一条边,现在求最少还需要添加几条边才能做到 分析:手欠没看清楚是相同的边只能相连一次,需要去重边,缩点后求出来 ...

  6. Python算法与数据结构--求所有子数组的和的最大值

    Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...

  7. poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数

    poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数 题目大意:如题目所示 给你一些关系图——连通图,想要问你有没有个节点,损坏后,可以生成几个互相独立的网络(也就是连通分量), ...

  8. POJ-3352 Road Construction,tarjan缩点求边双连通!

    Road Construction 本来不想做这个题,下午总结的时候发现自己花了一周的时间学连通图却连什么是边双连通不清楚,于是百度了一下相关内容,原来就是一个点到另一个至少有两条不同的路. 题意:给 ...

  9. Java实现 蓝桥杯 算法训练 求和求平均值

    试题 算法训练 求和求平均值 问题描述 从键盘输入10个浮点数,求出它们的和以及平均值,要求用函数实现 输入格式 测试数据的输入一定会满足的格式. 1 10 (1行10列的向量) 输出格式 要求用户的 ...

随机推荐

  1. Maven 系列 一 :Maven 快速入门及简单使用

    开发环境 MyEclipse 2014 JDK 1.8 Maven 3.2.1 1.什么是Maven? Maven是一个项目管理工具,主要用于项目构建,依赖管理,项目信息管理. 2.下载及安装 下载最 ...

  2. linux 使用笔记3

    解决linux下打开txt乱码问题 在Linux下要阅读windows生成的txt文件,需要通过iconv进行字符转化 iconv -f gb2312 -t utf8 ./读书笔记.txt > ...

  3. 使用Trinity拼接以及分析差异表达一个小例子

    使用Trinity拼接以及分析差异表达一个小例子  2017-06-12 09:42:47     293     0     0 Trinity 将测序数据分为许多独立的de Brujin grap ...

  4. Android NDK定位.so文件crash代码位置

    参考:http://blog.csdn.net/xyang81/article/details/42319789 问题:      QRD8926_110202平台的Browser必现报错.(去年的项 ...

  5. 三大框架中各种xml的存放位置

      web.xml中classpath:和classpath*:  有什么区别? classpath:只会到你的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar ...

  6. DevOps:从理念到实施

    转载自:http://os.51cto.com/art/201404/436794.htm DevOps这个新理念的出现,是为了应对IT环境中普遍面临的一些挑战.开发团队要求的不断满足新的客户需求,并 ...

  7. 日志分析工具、日志管理系统、syslog分析

    日志分析工具.日志管理系统.syslog分析 系统日志(Syslog)管理是几乎所有企业的重要需求.系统管理员将syslog看作是解决网络上系统日志支持的系统和设备性能问题的关键资源.人们往往低估了对 ...

  8. python学习 day18 (3月25日)---( 面向对象浅析)

    面向对象思想: 字典表示对象: 不是太好 因为 变量 得一个个的赋值改值 {'name':'alex','blood':20,'attack':1,'sex':'不'} {'name':'太亮','b ...

  9. Django的学习(一)————初入django

    一.基本指令 1.项目的建立: Django的项目建立,进入目录,打开cmd输入 django-admin startproject[项目名称],注意如果是在其他文件下把项目设计成资源文件. 2.Ap ...

  10. 2018.12.12 codeforces 938E. Max History(组合数学)

    传送门 唉最开始居然把题给看错了. 其实是组合数学傻逼题呢. 题意简述:给出一个数列,定义一个与数列有关的fff函数,fff函数定义如下: 首先f=0,M=1f=0,M=1f=0,M=1,一直重复如下 ...