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算法缩点求出度的更多相关文章
- POJ 1236 Network Of Schools (强连通分量缩点求出度为0的和入度为0的分量个数)
Network of Schools A number of schools are connected to a computer network. Agreements have been dev ...
- tarjan算法+缩点--cojs 908. 校园网
cojs 908. 校园网 ★★ 输入文件:schlnet.in 输出文件:schlnet.out 简单对比时间限制:1 s 内存限制:128 MB USACO/schlnet(译 b ...
- tarjan 缩点 求 scc
算法学自 BYVoid https://www.byvoid.com/zhs/blog/scc-tarjan/ 这个写得很清楚了 当然 你可能不这么认为 而且 如果是让我 一开始就从这个博客 学 ta ...
- POJ - 2553 tarjan算法+缩点
题意: 给你n个点,和m条单向边,问你有多少点满足(G)={v∈V|∀w∈V:(v→w)⇒(w→v)}关系,并把这些点输出(要注意的是这个关系中是蕴含关系而不是且(&&)关系) 题解: ...
- E - Redundant Paths - poj 3177(缩点求叶子节点)
题意:给一个图,想让每两个点之间都有两条路相连,不过特殊的是相同的两点之间多次相连被认为是一条边,现在求最少还需要添加几条边才能做到 分析:手欠没看清楚是相同的边只能相连一次,需要去重边,缩点后求出来 ...
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数
poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数 题目大意:如题目所示 给你一些关系图——连通图,想要问你有没有个节点,损坏后,可以生成几个互相独立的网络(也就是连通分量), ...
- POJ-3352 Road Construction,tarjan缩点求边双连通!
Road Construction 本来不想做这个题,下午总结的时候发现自己花了一周的时间学连通图却连什么是边双连通不清楚,于是百度了一下相关内容,原来就是一个点到另一个至少有两条不同的路. 题意:给 ...
- Java实现 蓝桥杯 算法训练 求和求平均值
试题 算法训练 求和求平均值 问题描述 从键盘输入10个浮点数,求出它们的和以及平均值,要求用函数实现 输入格式 测试数据的输入一定会满足的格式. 1 10 (1行10列的向量) 输出格式 要求用户的 ...
随机推荐
- start()方法和run()方法有什么区别?
通过调用线程类的start()方法来启动一个线程,使线程处于就绪状态,即可以被JVM来调度执行,在调度过程中,JVM通过调用线程类的run()方法来完成实际的业务逻辑,当run()方法结束后,此线程就 ...
- Data Dictionary 数据字典
数据字典是一种通用的程序设计方法.可以认为,不论什么程序,都是为了处理一定的主体,这里的主体可能是人员.商品(超子).网页.接口.数据库表.甚至需求分析等等.当主体有很多的属性,每种属性有很多的取值, ...
- ceres入门学习
转载自https://www.jianshu.com/p/e5b03cf22c80 Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographe ...
- 实现WireCard支付
实现WireCard支付,暂未完成 WireCardController.cs using System; using System.Collections.Generic; using System ...
- 关于ueditor 在struts2 中 上传图片 ,未找到上传文件 问题的解决方法
问题原因: ueditor 上传图片需请求imageUp.jsp文件,struts2 自带的拦截器(/*)把所有请求的文件都做了处理,所以导致无法上传图片. 解决方法: 方法一:自定义拦截器,让它在请 ...
- get load 代理对象
01使用session中的load方法查询数据库中的记录时,我们返回的是一个代理对象,而不是真正需要的那个对象. 02 因为代理对象的出现 才导致延迟加载. 还有采用懒加载的时候容易出现nosessi ...
- vue-cli引入jquery方法
方法一: 一,在package.json里加入, dependencies:{ ”jquery“:”^2.3.4“ } 二,在webpack.base.conf.js里加入 const webpack ...
- pat -1004(树的遍历)
题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184 思路: (1)用vector记录每 ...
- .NET性能优化(文摘)
第1章 性能指标 1.1 性能目标 1.2 性能指标 第2章 性能度量 2.1 性能度量方式 白盒测试-小程序 黑盒测试-大型程序 2.2 Windows内置工具 2.2.1 性能计数器 2.2.2 ...
- HTML5 通过 FileReader 实现文件上传
概述 在页面中上传时,之前一般都是需要使用form表单进行上传.html5 中提供了FileReader 可以将文件转换成Base64编码字符串,因此就可以直接使用 AJAX实现文件上传. 实现代码 ...