题意:给出有向图,图的底部是所有汇节点的子集,即,底部(G)={v∈V\x-∀w∈V:(v→w)⇒(w→v)},w在……里面G可以从v, v也可从w。让我们求有多少个点是绘点的问题。
思路:先求解出强连通分量,然后将求得的强连通分量看成是一个新点,进行缩点,要求绘点,那么求出这些新点中出度为零的点即可,最后从N个点中找出绘点并记录输出即可。
定义:
强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图。
强连通分量:在非强连通图的有向图中,选取部分点为强连通图,该强连通子图称为强连通分量。
求出强连通分量可以进行缩点操作。

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
const int maxx=20005;
const int inf=0x3f3f3f3f;
int low[maxx];
int dfn[maxx];
int vis[maxx];
int flag[maxx];
int blong[maxx];//记录这个节点属于哪个强连通分量
int indegree[maxx];//记录入度
int outdegree[maxx];//记录出度
int index;
int tcost[maxx];
int root;
int num[maxx];
int ans;//记录强连通分量的个数
int n,m;
int head[maxx];
stack<int>s;
vector<int>G[maxx];
void dfs(int u){index++;low[u]=dfn[u]=index;s.push(u);vis[u]=1;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(dfn[v]==0){dfs(v);low[u]=min(low[u],low[v]);}else if(vis[v]==1){low[u]=min(low[u],dfn[v]);}}if(dfn[u]==low[u]){ans++;int v;do{v=s.top();s.pop();blong[v]=ans;vis[v]=0;}while(u!=v);}
}
void init(){ans=0;memset(head,-1,sizeof(head));memset(flag,0,sizeof(flag));memset(num,0,sizeof(num));memset(vis,0,sizeof(vis));memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(blong,0,sizeof(blong));memset(indegree,0,sizeof(indegree));memset(outdegree,0,sizeof(outdegree));while(!s.empty())s.pop();for(int i=0;i<=n;i++){G[i].clear();}
}
int main(){while(scanf("%d",&n)!=EOF){if(n==0){break;}init();scanf("%d",&m);index=1;root=1;for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);G[a].push_back(b);}ans=0;for(int i=1;i<=n;i++){if(dfn[i]==0){dfs(i);}}for(int i=1;i<=n;i++){for(int j=0;j<G[i].size();j++){int v=G[i][j];if(blong[i]!=blong[v]){outdegree[blong[i]]++;}}}int ak=1;int t[maxx];for(int i=1;i<=n;i++){if(outdegree[blong[i]]==0){t[ak]=i;ak++; }}for(int i=1;i<ak-1;i++){cout<<t[i]<<" ";}cout<<t[ak-1]<<endl;}return 0;
}

poj2553(强连通分量)相关推荐

  1. 有向图——强连通分量

    有向图的强连通分量(strongly connected components) 在有向图G中,如果两个顶点vi,vj间(vi!=vj)有一条从vi到vj的路径,同时还有一条从vj到vi的路径(顶点相 ...

  2. 【C++】强连通分量

    强连通分量 先来一题例题 题目大意 怎么做? 分析 结论 不要高兴得太早 怎么办呢? 定义 缩点法 原图构建新图 发现 新的结论 强连通分量算法 Kosaraju算法 Tarjan算法 例题:信息传递 ...

  3. 极小连通子图和极大连通子图_强连通分量与拓扑排序

    前言 由于GacUI里面开始多处用上拓扑排序,我决定把之前瞎JB搞出来的算法换掉,换成个正式的.之前我自己弄了个写起来很简单的算法,然后每一处需要用到的地方我就重新做一遍.当然这样肯定也是不行的,我觉 ...

  4. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  5. HDU4635(强连通分量+Kosaraju算法)

    题意:给出一个有向图,最多添加多少条边使这个图依然不是强连通图:当这个图是强连通图时,输出-1: 求解思路:强连通分量求解: 强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图. ...

  6. poj3352(强连通分量)

    题意:添加多少边才能使这个无向图为双连通分量. 注意:双连通分量适用于无向图:而强连通分量适用于有向图.但是这两个概念都是一样的. #include<iostream> #include& ...

  7. poj2186(强连通分量)

    思路:找出出度为0 的顶点,如果出度为0的顶点大于1,则解为零,否则解就是出度为零的顶点的连通分支数. 刚开始是没有理解这道题的,也是看了大神之后才理解的. 方法一: #include<iost ...

  8. poj1236(强连通分量)

    题意: (1).至少需要向多少个学校发放软件,要使这个网络中的所有学校都能得到软件 (2).至少需要添加多少条边,才能使这个网络成为一个强连通分量图. 思路:首先求解强连通分量,如果不是同一个强连通分 ...

  9. HDU5934(强连通分量)

    题意:主要在诈弹爆炸的范围内如果存在其他的诈弹,那么在周围的诈弹也将会被引爆,这样思路就可以想到强连通分量了: 思路:先求解强连通分量,在找到强连通分量时,也求解出这个强连通分量的最小费用mincos ...

最新文章

  1. 浅谈Transformer的初始化、参数化与标准化
  2. hdu 1874畅通工程续(基础Floyd)
  3. php上传图片完成后的截图,php实现粘贴截图并完成上传功能
  4. opencv:用最邻近插值和双线性插值法实现上采样(放大图像)与下采样(缩小图像)
  5. framebuffer驱动
  6. 28 SD配置-主数据-信用管理-定义信贷组
  7. PHP学习笔记01——基础语法
  8. 位运算 进制转化 STL中bitset用法
  9. 9. PHP 字符串
  10. Linux命令学习教程【建议收藏】
  11. 下载SE78里面的图片
  12. 信度和效度经典例子_信度与效度有什么关系?
  13. java 创建一个类_java创建一个类
  14. 网络出口究竟选择防火墙,还是路由器?
  15. 怎样获得淘宝/天猫淘口令真实url
  16. HDU杭电OJ经典100题2000-2099_Java版详细题解(持续更新)
  17. 面试时如何用英语自我介绍?
  18. 常见的网络连接设备有哪些?
  19. Webug 4.0下载地址
  20. 强化学习笔记(3)-时序差分更新算法

热门文章

  1. C++库文件和头文件编写教程
  2. 可微分的「OpenCV」:这是基于PyTorch的可微计算机视觉库
  3. Classifying dynamic textures via spatiotemporal fractal analysis(许教授)
  4. 草根seo站长利用网站赚钱的方法
  5. BCH专属“谷歌地图”凸显BCH魅力
  6. HPQLOCFG 批量管理 HP iLO 实践
  7. 扒一扒.net、.net framework、mono和Unity
  8. jsp 分页 tag
  9. 微信公共平台消息回复类
  10. [转]ISTQB FL初级认证考试资料(中文)