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列的向量) 输出格式 要求用户的 ...
随机推荐
- Junit4知识梳理
一.junit官网 junit4:http://junit.org/junit4/ junit5:http://junit.org/junit5/ 二.github junit4: https://g ...
- Linux系统性能监控工具介绍之-tsar
Linux系统性能监控工具介绍之-tsar Linux系统性能监控工具介绍之-tsar 2017-03-02 20:25 175人阅读 评论(0) 收藏 举报 分类: LINUX调优(9) 目 ...
- Ubuntu下安装VS code
sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make sudo apt-get update sudo apt-get install ubun ...
- NC 6系后台调用接口保存单据
IPFBusiAction ipf = (IPFBusiAction)NCLocator.getInstance().lookup(IPFBusiAction.class); ipf.processA ...
- springmvc+mybatis 构建cms+UC浏览器文章功能
最近公司在模拟UC浏览器做一个简单的cms系统,主要针对于企业内部的文章浏览需求,这边考虑用户大多用mobile浏览文章内容,故使用原生的ios和android进行开发,后面也会集成html5. 1. ...
- 解决CentOS7-python-pip安装失败
Pip介绍 pip 是一个安装和管理 Python 包的工具,python安装包的工具有easy_install, setuptools, pip,distribute.使用这些工具都能下载并安装dj ...
- openssl_error_string()
其实已经成功了,openssl_error_string()一样会输出错误信息,忽略就好
- sql 用Group by分组后,取每组的前几条记录
转自:http://blog.163.com/jeson_lwj/blog/static/135761083201052411115783/ --查询每门课程的前2名成绩 CREATE TABLE S ...
- How to Create Triggers in MySQL
https://www.sitepoint.com/how-to-create-mysql-triggers/ I created two tables: CREATE TABLE `sw_user` ...
- flask在其他文件中添加路由
应用文件为:app.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): re ...