POJ 2186 Popular Cows(强连通,kosaraju算法)
来源:互联网 发布:网络缓存文件夹在哪里 编辑:程序博客网 时间:2024/05/22 00:48
题意:
有m个有序对,且满足传递性。求解满足以下性质的点的个数,从其他每个点都可以通过有向边到达该点。
思路:
如果A, B都满足性质,则A,B至少在一个有向环上,所以满足性质的点属于同一连通分量。
我们可以用双向dfs算法求出SCC,并且从最后一个连通分量拿一个元素来检查是否可以沿着反图访问到每个点。
//#include<bits/stdc++.h>#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <vector>#include <queue>#include <stack>#include <cassert>#include <algorithm>#include <cmath>#include <climits>#include <set>#include <map>using namespace std;#define SPEED_UP iostream::sync_with_stdio(false);#define FIXED_FLOAT cout.setf(ios::fixed, ios::floatfield);#define rep(i, s, t) for(int (i)=(s);(i)<=(t);++(i))#define urep(i, s, t) for(int (i)=(s);(i)>=(t);--(i))#define in_bound(l, r, i) (l)<=(i)&&(i)<(r)#define pb push_backtypedef long long LL;struct Edge{ int from, to;};const int Maxn = 10000+100;const int inf = INT_MAX/2;int used[Maxn], sccNo[Maxn], n, m;vector<int> g[Maxn], rg[Maxn], vs;void dfs(int now) { used[now] = 1; int sz = g[now].size(), v; rep(i, 0, sz-1) { v = g[now][i]; if (!used[v]) dfs(v); } vs.push_back(now);}void rdfs(int now, int flag) { used[now] = 1; sccNo[now] = flag; int sz = rg[now].size(), v; rep(i, 0, sz-1) { v = rg[now][i]; if (!used[v]) rdfs(v, flag); }}int scc(int V) { memset(used, 0, sizeof(used)); vs.clear(); //rep(i, 0, V-1) // if (!used[i]) dfs(i); urep(i, V-1, 0) if (!used[i]) dfs(i); memset(used, 0, sizeof(used)); int cnt = 0; urep(i, V-1, 0) if (!used[vs[i]]) rdfs(vs[i], cnt++); return cnt;}void add_edge(int from, int to) { g[from].push_back(to); rg[to].push_back(from);}void init() { rep(i, 0, n-1) { g[i].clear(); rg[i].clear(); } rep(i, 0, m-1) { int x, y; cin >> x >> y; add_edge(x-1, y-1); }}int solve() { int tot = scc(n); int num = 0, u; rep(i, 0, n-1) if (sccNo[i] == tot-1) { ++num; u = i; } memset(used, 0, sizeof(used)); rdfs(u, tot-1); rep(i, 0, n-1) if (!used[i]) return 0; return num;}int main() {#ifndef ONLINE_JUDGE freopen("input.in", "r", stdin);#endif SPEED_UP while (cin >> n >> m) { init(); cout << solve() << endl; } return 0;}
0 0
- POJ 2186 Popular Cows(强连通,kosaraju算法)
- POJ 2186 Popular Cows 强连通分量 Kosaraju算法
- 强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)
- POJ-2186 Popular Cows (强连通分量[Kosaraju])
- [ACM] POJ 2186 Popular Cows (强连通分量,Kosaraju算法知识整理)
- POJ 2186 Popular Cows 强连通分量 Kosaraju or tarjan
- poj 2186 Popular Cows Kosaraju求强连通分量
- POJ 2186 Popular Cows【强连通Kosaraju+缩点】
- POJ 2186 Popular Cows 强连通分量(Kosaraju)
- 链式前向星,kosaraju,Tarjan,Gabow算法的理解,POJ 2186 Popular Cows(强连通分量)
- poj 2186 Popular Cows(强连通分量,tarjan或Kosaraju)
- POJ 2186 Popular Cows(强连通分量Tarjan算法)
- POJ 2186 Popular Cows(强连通)
- POJ 2186 Popular Cows(强连通)
- POJ -- 2186 Popular Cows(强连通)
- poj 2186 Popular Cows(强连通)
- poj2186 Popular Cows--Kosaraju算法 & 缩点 & 强连通分量
- POJ2186 Popular Cows【Kosaraju】【强连通分量】
- 剖析程序的内存布局
- VC 获取屏幕及打印机的像素,DPI,英寸数,毫米数,缇数(twips)
- 图的割点算法vs图的割边算法
- 内存和FLASH的区别总结
- SQL Server 数据库设计
- POJ 2186 Popular Cows(强连通,kosaraju算法)
- Cocos2d-x3.3Final(9)RichText常用成员函数(C++)
- Android 通过Socket 和服务器通讯
- Android Bitmap之Loading Large Bitmaps Efficiently
- caffe源码解析之Layer层(1)
- android 中处理崩溃异常并重启程序
- Linux操作命令(二)
- (转) Java内部类的使用小结
- Code[vs]1010过河卒(dfs不成+棋盘dp)