题目链接:https://vjudge.net/problem/POJ-2553

如果不会tarjan算法,推荐博客:https://blog.csdn.net/mengxiang000000/article/details/51672725

题意大意:第一行输入一个n(n==0时结束程序),和一个m分别代表点数和边数,接下来一行有2*m个数字,每两个数字u,v表示一条有向边,即u可以到达v。

假如一个点a可以到b,c,d,e这些点,并且这些点也可以到达a点,则a点就是符合要求的点,即一个点可以到达的其他所有点都可以反过来到达这个点,则这个点就是符合要求的点,当然,如果这个点不能到其他任何点,那么这个点也是符合要求的,,现在就让我们找出所有符合要求的点,并且升序输出。。

所以我们的思路先用tarjan算法进行缩点操作,求出所有的强连通分量并且染色,这样的话一个强连通分量里所有的点之间都是相互可达的,而如果某个强连通分量里的点可以到其他强连通分量里的点,即这个强连通分量缩成一个点之后的出度不为0,那么这个强连通分量里所有的点都是不符合要求的,因为另一个强连通分量里的所有点必然不可能到达第一个强连通分量,否则两个强连通分量就可以合成一个了。所以我们的任务就是找到出度为0的所有强连通分量,然后把这些强连通分量里的点排序输出。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
#define eps 1e-8
#define ll long long
#define INF 0x3f3f3f3f
#define maxn 5005
/*struct point{
int u,w;
};
bool operator <(const point &s1,const point &s2)
{
if(s1.w!=s2.w)
return s1.w>s2.w;
else
return s1.u>s2.u;
}*/
int n,k,m,t;
int ans,top,cnt,color_num,time;
int dfn[maxn],vis[maxn],s[maxn],color[maxn],head[maxn],low[maxn];
//dfn[i]表示是第几个单位时间到i点,vis[i]表示i点是否在栈中,s是栈,color[i]表示点i的颜色,即它是属于哪个强连通分量
//low[i]用来判断强连通分量(low[i]==dfn[i])
int out[maxn],ss[maxn];//out[i]表示编号为i的强连通分量的出度,ss里面储存出度为0的强连通分量里面的点,
//之后把ss数组 里面的点排序之后输出
struct node{
int v,next;
}edge[maxn*];
void init()
{
memset(vis,,sizeof(vis));
memset(head,-,sizeof(head));
memset(color,,sizeof(color));
memset(out,,sizeof(out));
memset(dfn,,sizeof(dfn));
ans=top=cnt=color_num=time=;
}
void add(int u,int v)
{
edge[++cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
void tarjan(int u)//找强连通分量
{
dfn[u]=low[u]=++time;
vis[u]=;
s[++top]=u;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].v;
if(!dfn[v])//第一次到v点,则继续深搜
tarjan(v);
low[u]=min(low[u],low[v]);//将最小值向上传递
}
if(low[u]==dfn[u])
{
ans++;
color_num++;
int v;
do{
v=s[top--];//出栈
vis[v]=;
color[v]=color_num;//染色,同一个强连通分量的所有点都是同一个编号
}while(u!=v);
}
}
void solve()
{
for(int i=;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
for(int u=;u<=n;u++)//枚举所有点
{
for(int i=head[u];i!=-;i=edge[i].next)//枚举所有和u点相邻的边
{
int v=edge[i].v;
int a=color[u];
int b=color[v];
if(a!=b)//如果u和v的颜色不同,即a,b不同,则out[a]的出度++
{
out[a]++;
}
}
}
int num=;
for(int i=;i<=n;i++)
{
if(out[color[i]]==)//储存出度为0的强连通分量里面的点
ss[num++]=i;
}
sort(ss,ss+num);//排序
for(int i=;i<num;i++)//输出结果
{
if(i!=num-)
cout<<ss[i]<<' ';
else
cout<<ss[i]<<endl;
}
}
int main()
{
while((cin>>n>>m)&&n)
{
init();
for(int i=;i<m;i++)
{
int u,v;
cin>>u>>v;
add(u,v);
}
solve();
}
return ;
}

poj 2553 缩点+染色+出度的更多相关文章

  1. poj 2553 The Bottom of a Graph(强连通分量+缩点)

    题目地址:http://poj.org/problem?id=2553 The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K ...

  2. POJ 2553 The Bottom of a Graph Tarjan找环缩点(题解解释输入)

    Description We will use the following (standard) definitions from graph theory. Let V be a nonempty ...

  3. POJ 2553 The Bottom of a Graph(强连通分量)

    POJ 2553 The Bottom of a Graph 题目链接 题意:给定一个有向图,求出度为0的强连通分量 思路:缩点搞就可以 代码: #include <cstdio> #in ...

  4. POJ 2553 The Bottom of a Graph (强连通分量)

    题目地址:POJ 2553 题目意思不好理解.题意是:G图中从v可达的全部点w,也都能够达到v,这种v称为sink.然后升序输出全部的sink. 对于一个强连通分量来说,全部的点都符合这一条件,可是假 ...

  5. poj2186tarjan算法缩点求出度

    poj2186tarjan算法缩点求出度 自己打一遍第一题,入门啦,入门啦 题目还算简单,多头牛,给你仰慕关系(可传递),问你最后有没有牛被所有的牛仰慕 根据关系可以建图,利用tarjan算法缩点处理 ...

  6. 缩点+染色+DFS codeforce467D

    题目链接:https://vjudge.net/contest/219056#problem/A 推荐博客:https://blog.csdn.net/ck_boss/article/details/ ...

  7. poj 2553 强连通分支与缩点

    思路:将所有强连通分支找出来,并进行缩点,然后找其中所有出度为0的连通分支,就是题目要求的. #include<iostream> #include<cstdio> #incl ...

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

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

  9. poj 2553强连通+缩点

    /*先吐槽下,刚开始没看懂题,以为只能是一个连通图0T0 题意:给你一个有向图,求G图中从v可达的所有点w,也都可以达到v,这样的v称为sink.求这样的v. 解;求强连通+缩点.求所有出度为0的点即 ...

随机推荐

  1. 转载:approxPolyDP函数

    本文转载http://blog.csdn.net/qq_18343569/article/details/47999257 1.approxPolyDP函数 函数的作用: 对图像轮廓点进行多边形拟合 ...

  2. Node 操作 MySQL 数据库

    1, 下载 mysql 依赖 => npm -i mysql 2, 写一个核心工具类, 用于获取线程池连接 mysql-util.js // 引入 mysql 数据库连接依赖 const mys ...

  3. Jenkins配置中安装插件时提示“No such plugin: cloudbees-folder”

    第一次配置Jenkins时,执行下图中出现“No such plugin: cloudbees-folder”,这时应该是服务还没起完全,稍等等就好

  4. STM32F105开发板

  5. react-native android打包

    看了官网测试的是可以的,自己整理下,方便后面查看 先是生产安卓证书,安卓证书生成,点这里.这里掠过 生成安卓证书,记住2个密码 秘钥库口令 和 私钥密码 1.然后把你生成的安卓证书放到文件放到你工程中 ...

  6. MySQL性能分析(转)

    第一步:检查系统的状态 通过操作系统的一些工具检查系统的状态,比如CPU.内存.交换.磁盘的利用率.IO.网络,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲,这也可能不是一个正常的状 ...

  7. HTML页面3秒后自动跳转的三种常见方法

    在练习中,我们常常遇到一种问题就是,怎么实现页面N秒之后自动跳转呢? 我自己遇到问题和查找资料,总结了3个方法 方法1:  最简单的一种:直接在前面<head>里面添加代码: 复制代码 代 ...

  8. oracle数据库升级dbua操作阻塞解决方法(解决ORA-32004报错)

    操作环境 1.SuSE11sp3操作系统 2.oracle 11.2.0.3版本升级到11.2.0.4版本 问题现象   oracle 11.2.0.3版本升级到11.2.0.4版本时执行dbua命令 ...

  9. ArcGIS案例学习笔记-批量裁剪地理模型

    ArcGIS案例学习笔记-批量裁剪地理模型 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:空间数据的批量裁剪 优点:1.批量裁剪:任意多个目标数据,去裁剪任意 ...

  10. 解决运行wamp提示“MSVCR110.dll”丢失的问题!

    我在Windows系统上安装wampserver2.5 64位,安装到最后,总是提示丢失msvcr110.dll 解决办法: 到这个网站下载一个Visual C++ Redistributable f ...