poj2186 强连通分量+缩点
2015-09-05 23:43
260 查看
终于把Kosaraju算法看懂了,附上链接:点击打开链接
题意:如果A仰慕B,B仰慕C那么A仰慕C,1~n同牛中求有多少头牛被所有的牛仰慕。
分析:若存在多个牛同时被所有的牛仰慕,那么这些牛可以构成一个强连通分量,那么就可以把所有的强连通分量压缩成一个点,这样这些点中只有处于叶子节点的强连通分量才有可能被所有的店点经过,而且是只有一个叶子节点,这样在求强连通分量的过程中可以对这些点进行标记,最终就可以找到了。目前只学会了这一个算法,代码如下。
Kosaraju
Kosaraju
Kosaraju
题意:如果A仰慕B,B仰慕C那么A仰慕C,1~n同牛中求有多少头牛被所有的牛仰慕。
分析:若存在多个牛同时被所有的牛仰慕,那么这些牛可以构成一个强连通分量,那么就可以把所有的强连通分量压缩成一个点,这样这些点中只有处于叶子节点的强连通分量才有可能被所有的店点经过,而且是只有一个叶子节点,这样在求强连通分量的过程中可以对这些点进行标记,最终就可以找到了。目前只学会了这一个算法,代码如下。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define ll long long int a[7]; const int maxn = 10000 + 5; struct Eage{ int to, next; }eage1[maxn*5], eage2[maxn*5]; int vis[maxn]; int head1[maxn], head2[maxn], lis[maxn]; int n, m, cnt1, cnt2, t; void add(int x, int y)//建立正向图和反向图 { eage1[cnt1].to = y; eage1[cnt1].next = head1[x]; head1[x] = cnt1++; eage2[cnt2].to = x; eage2[cnt2].next = head2[y]; head2[y] = cnt2++; } void dfs1(int u)//类似于拓扑排序 { vis[u] = 1; for (int i = head1[u]; i != -1; i = eage1[i].next) { int v = eage1[i].to; if (!vis[v])dfs1(v); } lis[t++] = u;//将拓扑排序的结果从放到栈中,从结尾到开头 } void dfs2(int u, int t) { vis[u] = t;//一个强连通分量 for (int i = head2[u]; i != -1; i = eage2[i].next) { int v = eage2[i].to; if (!vis[v])dfs2(v, t); } } int main() { //freopen("input.txt", "r", stdin); cin >> n >> m; memset(head1, -1, sizeof(head1)); memset(head2, -1, sizeof(head2)); cnt1 = cnt2 = 0; for (int i = 0; i < m; i++) { int x, y; scanf("%d%d", &x, &y); add(x, y); } memset(vis, 0, sizeof(vis)); t = 0; for (int i = 1; i <= n; i++) { if (!vis[i])dfs1(i); } memset(vis, 0, sizeof(vis)); int ans = 0; for (int i = t-1; i >= 0; i--) { if (!vis[lis[i]]) { dfs2(lis[i], ++ans); } } int cnt = 0, u = 0; for (int i = 1; i <= n; i++) { if (vis[i] == ans) {//最后搜到的,也就是出度为0的个数 cnt++; u = i; } } memset(vis, 0, sizeof(vis)); dfs2(u, 1); for (int i = 1; i <= n; i++) { if (!vis[i]){ cnt = 0; break; } } cout << cnt << endl; return 0; }
Kosaraju
Kosaraju
Kosaraju
相关文章推荐
- 9.2总结
- 深入分析Java线程中断问题
- Elasticsearch、MongoDB和Hadoop比较
- iOS沙盒(sandBox)机制(一)之获取沙盒路径及目录说明
- 【各种系列教程】fms p2p视频教程 第一节安装已经运用
- HHvm建站环境搭建方法:Nginx,Mariadb,hhvm及lnmp/lamp安装部署 | 免费资源部落
- Web设计——初识HTML
- 详解OpenGL中的各种变换(投影变换,模型变换,视图变换)(二)——投影变换
- Java的位运算符详解——与(&)、非(~)、或(|)、异或(^)
- 流年,命运流沙
- 连载《一个程序猿的生命周期》-28、被忽悠来的单身HR(女同志)
- 二叉搜索树的c++实现(含深复制)
- 微信文章抓取接口
- iOS多线程学习之NSOperation(一)
- mac系统下读取移动硬盘的小问题
- Flood loader tester
- Effective C++——条款23(第4章)
- 2015.09.05 网络笔记
- 连载《一个程序猿的生命周期》-28、被忽悠来的单身HR(女同志)
- iOS-本地推送和远程推送,常用的三方推送和常用的测试方法,推送实现和原理详解