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. mysql学习笔记-1.下载与安装

    1.到mysql官网下载操作系统对应的数据库,下载地址https://dev.mysql.com/downloads/mysql/ 2.有msi安装版本和zip压缩版本,2种安装方式不同, 3.安装后 ...

  2. Java与go哪个更适合后端开发呢?哪个更适合新手呢?

    Java语言目前在后端开发领域有广泛的应用,尤其是大型互联网平台往往选择Java作为主要的后端编程语言.同时,Java自身的生态比较健全,也有大量的成功案例,所以采用Java做后端编程语言是一个风险比 ...

  3. Nowcoder OI赛制测试2 F 假的数学题 - 斯特林公式 + 二分

    Description 给定$X$, 找到最小的$N$ 使得$N! > X^X$ 数据范围:  $x <= 1e11$ Solution $X^X$ 太大, 高精也存不过, 所以取对数 : ...

  4. [Robot Framework] 怎么写动态等待?

    举例:Robot Framwork+WhiteLibrary,等待元素可用或不可用 Wait Until Object Is Enabled Wait Until Object Is Not Enab ...

  5. SSH无法连上CentOS7的问题

    今天安装完带GNOME的CentOS后发现XShell无法连接上Linux. 原因是sshd服务没有开启.下面是解决办法: 1 ip addr 发现网卡名称为ens33 2 在/etc/sysconf ...

  6. Java,JavaScript,jQuery,jSP,js

    js是javascript文件的文件后缀,就像 a.txt 这个.txt是后缀一样 jsp是jsp网页文件的后缀,而jsp是java web 的表现层的一种技术 jquery 是一个函数库,基于jav ...

  7. boost的accumulator rolling_mean的使用

    Boost.Accumulators is both a library for incremental statistical computation as well as an extensibl ...

  8. Python参数类型

    位置参数 默认参数 可变参数 命名关键字参数 关键字参数 def position_only(a, b): print(a, b) def keyword(a='a', b='b'): print(a ...

  9. 【Web】Nginx 反向代理与负载均衡

    反向代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...

  10. day13作业—(登录注册)

    2.写一个函数完成三次登陆功能: 用户的用户名密码从一个文件register中取出. register文件包含多个用户名,密码,用户名密码通过|隔开,每个人的用户名密码占用文件中一行. 完成三次验证, ...