poj2553(强连通分量)
题意:给出有向图,图的底部是所有汇节点的子集,即,底部(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(强连通分量)相关推荐
- 有向图——强连通分量
有向图的强连通分量(strongly connected components) 在有向图G中,如果两个顶点vi,vj间(vi!=vj)有一条从vi到vj的路径,同时还有一条从vj到vi的路径(顶点相 ...
- 【C++】强连通分量
强连通分量 先来一题例题 题目大意 怎么做? 分析 结论 不要高兴得太早 怎么办呢? 定义 缩点法 原图构建新图 发现 新的结论 强连通分量算法 Kosaraju算法 Tarjan算法 例题:信息传递 ...
- 极小连通子图和极大连通子图_强连通分量与拓扑排序
前言 由于GacUI里面开始多处用上拓扑排序,我决定把之前瞎JB搞出来的算法换掉,换成个正式的.之前我自己弄了个写起来很简单的算法,然后每一处需要用到的地方我就重新做一遍.当然这样肯定也是不行的,我觉 ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...
转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...
- HDU4635(强连通分量+Kosaraju算法)
题意:给出一个有向图,最多添加多少条边使这个图依然不是强连通图:当这个图是强连通图时,输出-1: 求解思路:强连通分量求解: 强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图. ...
- poj3352(强连通分量)
题意:添加多少边才能使这个无向图为双连通分量. 注意:双连通分量适用于无向图:而强连通分量适用于有向图.但是这两个概念都是一样的. #include<iostream> #include& ...
- poj2186(强连通分量)
思路:找出出度为0 的顶点,如果出度为0的顶点大于1,则解为零,否则解就是出度为零的顶点的连通分支数. 刚开始是没有理解这道题的,也是看了大神之后才理解的. 方法一: #include<iost ...
- poj1236(强连通分量)
题意: (1).至少需要向多少个学校发放软件,要使这个网络中的所有学校都能得到软件 (2).至少需要添加多少条边,才能使这个网络成为一个强连通分量图. 思路:首先求解强连通分量,如果不是同一个强连通分 ...
- HDU5934(强连通分量)
题意:主要在诈弹爆炸的范围内如果存在其他的诈弹,那么在周围的诈弹也将会被引爆,这样思路就可以想到强连通分量了: 思路:先求解强连通分量,在找到强连通分量时,也求解出这个强连通分量的最小费用mincos ...
最新文章
- 浅谈Transformer的初始化、参数化与标准化
- hdu 1874畅通工程续(基础Floyd)
- php上传图片完成后的截图,php实现粘贴截图并完成上传功能
- opencv:用最邻近插值和双线性插值法实现上采样(放大图像)与下采样(缩小图像)
- framebuffer驱动
- 28 SD配置-主数据-信用管理-定义信贷组
- PHP学习笔记01——基础语法
- 位运算 进制转化 STL中bitset用法
- 9. PHP 字符串
- Linux命令学习教程【建议收藏】
- 下载SE78里面的图片
- 信度和效度经典例子_信度与效度有什么关系?
- java 创建一个类_java创建一个类
- 网络出口究竟选择防火墙,还是路由器?
- 怎样获得淘宝/天猫淘口令真实url
- HDU杭电OJ经典100题2000-2099_Java版详细题解(持续更新)
- 面试时如何用英语自我介绍?
- 常见的网络连接设备有哪些?
- Webug 4.0下载地址
- 强化学习笔记(3)-时序差分更新算法
热门文章
- C++库文件和头文件编写教程
- 可微分的「OpenCV」:这是基于PyTorch的可微计算机视觉库
- Classifying dynamic textures via spatiotemporal fractal analysis(许教授)
- 草根seo站长利用网站赚钱的方法
- BCH专属“谷歌地图”凸显BCH魅力
- HPQLOCFG 批量管理 HP iLO 实践
- 扒一扒.net、.net framework、mono和Unity
- jsp 分页 tag
- 微信公共平台消息回复类
- [转]ISTQB FL初级认证考试资料(中文)