题意:

求出图中所有汇点

定义:点v是汇点须满足 --- 对图中任意点u,若v可以到达u则必有u到v的路径;若v不可以到达u,则u到v的路径可有可无。

模板:http://www.cnblogs.com/Jadon97/p/8328750.html

分析:

很显然, 图中强连通分量中所有的点属性都是一样的, 要么都是汇点, 要么都不是。

如果有一个强连通分量A的边连向强连通分量B, 那么A一定不是汇点, 因为B不会有边连向A(如果有的话A、B就是同一个强连通分量了)。

求出所有强连通分量, 然后再求一下出度即可

#include <stack>
#include <cstdio>
#include <vector>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = ;
vector<int> G[maxn];
int n , m;
int dfn[maxn], low[maxn], color[maxn], out_degree[maxn];
int dfs_num = , col_num = ;
bool vis[maxn];//标记元素是否在栈中
stack<int> s;
void Tarjan(int u)
{
dfn[ u ] = dfs_num;
low[ u ] = dfs_num++;
vis[u] = true; //标记访问
s.push(u); // 入栈
for(int i = ; i < G[u].size(); i++)
{
int v = G[u][i];
if( ! dfn[v])
{
Tarjan( v );
low[u] = min(low[v], low[u]);
}
else if(vis[v]) //如果在v栈中 , 更新low[u]
{
low[u] = min(low[u], dfn[v]);
}
}
if(dfn[u] == low[u])
{
vis[u] = false;
color[u] = col_num;
int t;
for(;;){
int t = s.top(); s.pop();
color[t] = col_num;
vis[t] = false;
if(t == u) break;
}
col_num++;
}
}
int main()
{
while(~scanf("%d %d", &n,&m))
{
if(n == ) break;
for(int i = ; i < maxn; i++) G[i].clear();
memset(dfn, , sizeof(dfn));
memset(vis, , sizeof(vis));
memset(low, , sizeof(low));
memset(color, , sizeof(color));
memset( out_degree, ,sizeof(out_degree));
dfs_num = , col_num = ;
for(int i = ; i < m; i++)
{
int u , v;
scanf("%d %d", &u, &v);
G[u].push_back(v);
} for(int i = ; i <= n; i++){
if(!dfn[i])
Tarjan(i);
} for(int u = ; u <= n; u++){ //
for(int i = ; i < G[u].size(); i++){//枚举每一条边
int v = G[u][i];
if(color[u] != color[v]){ //如果有一条u到v的边, 但u,v不是同一个强连通分量, 说明u所在的强连通分量有一条出边指向v, u中都不是题目所求
out_degree[color[u]]++;
}
}
} int cnt = , ans[maxn];
for(int u = ; u <= n; u++){
if(out_degree[color[u]] == ) ans[cnt++] = u;
}
printf("%d",ans[]);
for(int i = ;i < cnt; i++) printf(" %d", ans[i]); puts("");
}
return ;
}

最新文章

  1. 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间
  2. linux常用命令(二)
  3. C++变量和函数
  4. (转)PowerDesigner提示Existence of index、key、reference错误
  5. 【Vegas原创】RHEL6多界面切换方法
  6. 3.工厂方法模式(Factory Method)
  7. 安装CentOS
  8. js 打开PDF
  9. 学习笔记_Java get和post区别(转载_GET一般用于获取/查询资源信息,而POST一般用于更新资源信息)
  10. php与http协议
  11. linux查看系统版本
  12. 学习Emacs
  13. 灰度共生矩阵(GLCM) 及matlab代码实现
  14. CLR基础之一---认识CLR [《CLR via C#》读书笔记]
  15. 一个想法照进现实-《IT连》创业项目:一个转折一个反思
  16. 虚拟机Vmware成功安装Ubuntu Server 16.04中文版
  17. Django ORM 知识概要
  18. OC调用c++函数
  19. L3-019 代码排版 (30 分)
  20. JDK1.5新特性,基础类库篇,线程类(Thread)增强了哪些

热门文章

  1. iOS 让部分ViewController支持屏幕旋转
  2. 跟我一起玩Win32开发(20):浏览文件夹
  3. Qt基本应用
  4. websocket实现单聊
  5. BZOJ4653(区间离散化+线段树+决策单调尺取)
  6. 牛客网NOIP赛前集训营-普及组
  7. Zernike矩之边缘检测(附源码)
  8. 在 CentOS 环境下安装 .NET Core
  9. Spark MLlib编程API入门系列之特征选择之向量选择(VectorSlicer)
  10. Design Compiler 综合