强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)
poj 2186 Popular Cows
题意:
有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3。
求被全部牛都欢迎的牛的数量。
限制:
1 <= N <= 10000
1 <= M <= 50000
思路:
Kosaraju算法, 看缩点后拓扑序的终点有多少头牛, 且要推断是不是全部强连通分量都连向它。
Kosaraju算法。分拆完连通分量后,也完毕了拓扑序。
/*poj 2186 Popular Cows
题意:
有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3。 求被全部牛都欢迎的牛的数量。
限制:
1 <= N <= 10000
1 <= M <= 50000
思路:
Kosaraju算法, 看缩点后拓扑序的终点有多少头牛, 且要推断是不是全部强连通分量都连向它。
*/
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define PB push_back
const int MAX_V = 1e4+5;
int V;
vector<int> G[MAX_V]; //图
vector<int> rG[MAX_V]; //反向图
vector<int> vs; //后序遍历顺序的顶点列表
bool used[MAX_V]; //訪问标记
int cmp[MAX_V]; //所属强连通分量的拓扑序
void add_edge(int fr, int to){
G[fr].PB(to);
rG[to].PB(fr);
}
void dfs(int u){
used[u] = true;
for(int i = 0; i < G[u].size(); ++i){
int ch = G[u][i];
if(!used[ch]) dfs(ch);
}
vs.PB(u);
}
void rdfs(int u,int k){
used[u] = true;
cmp[u] = k;
for(int i = 0; i < rG[u].size(); ++i){
int ch = rG[u][i];
if(!used[ch]) rdfs(ch, k);
}
}
//点的序号从0開始
int scc(){
fill(used, used+V, 0);
vs.clear();
for(int v = 0; v < V; ++v){
if(!used[v]) dfs(v);
}
fill(used, used+V, 0);
int k = 0;
for(int i = vs.size() - 1; i >= 0; --i){
if(!used[vs[i]]) rdfs(vs[i], k++);
}
return k;
} void init(int n){
for(int i = 0; i <= n; ++i){
G[i].clear();
rG[i].clear();
}
}
int main(){
int n, m;
while(scanf("%d%d", &n, &m) != EOF){
init(n);
V = n;
for(int i = 0; i < m; ++i){
int u, v;
scanf("%d%d", &u, &v);
add_edge(u-1, v-1);
}
int scc_cnt = scc();
int u = 0;
int ans = 0;
for(int i = 0; i < V; ++i){
if(cmp[i] == scc_cnt - 1){
u = i;
++ans;
}
} //推断强连通分量是否连通
fill(used, used+V, 0);
rdfs(u, 0);
for(int i = 0; i < V; ++i){
if(!used[i]){
// 存在不可达的点
ans = 0;
break;
}
}
printf("%d\n", ans);
}
return 0;
}
强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)的更多相关文章
- poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】
题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Sub ...
- poj 2186 Popular Cows (强连通分量+缩点)
http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissi ...
- poj 2186 "Popular Cows"(强连通分量入门题)
传送门 参考资料: [1]:挑战程序设计竞赛 题意: 每头牛都想成为牛群中的红人. 给定N头牛的牛群和M个有序对(A, B),(A, B)表示牛A认为牛B是红人: 该关系具有传递性,所以如果牛A认为牛 ...
- POJ 2186 Popular Cows (强联通)
id=2186">http://poj.org/problem? id=2186 Popular Cows Time Limit: 2000MS Memory Limit: 655 ...
- tarjan缩点练习 洛谷P3387 【模板】缩点+poj 2186 Popular Cows
缩点练习 洛谷 P3387 [模板]缩点 缩点 解题思路: 都说是模板了...先缩点把有环图转换成DAG 然后拓扑排序即可 #include <bits/stdc++.h> using n ...
- POJ 2186 Popular Cows(强连通分量Kosaraju)
http://poj.org/problem?id=2186 题意: 一个有向图,求出点的个数(任意点可达). 思路: Kosaraju算法的第一次dfs是后序遍历,而第二次遍历时遍历它的反向图,从标 ...
- POJ 2186 Popular cows(Kosaraju+强联通分量模板)
题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为 ...
- POJ 2186 Popular Cows(强连通分量)
[题目链接] http://poj.org/problem?id=2186 [题目大意] 给出一张有向图,问能被所有点到达的点的数量 [题解] 我们发现能成为答案的,只有拓扑序最后的SCC中的所有点, ...
- [强连通分量] POJ 2186 Popular Cows
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31815 Accepted: 12927 De ...
随机推荐
- sql中使用正则查询
- dedecms关键词维护里面字数多的词优先字数少的词的解决办法
织梦后台的关键词维护默认的情况是字数少的词优先于字数多的词,比如我们有两个这样的词:创业.创业方向,第二个词包含了第一个词,在文章中如果出现“创业方向”这个词,默认情况下只会给创业两个字添加关键词超链 ...
- 紫书 例题 9-2 UVa 437 ( DAG的动态规划)
很明显可以根据放不放建边,然后最一遍最长路即是答案 DAG上的动态规划就是根据题目中的二元关系来建一个 DAG,然后跑一遍最长路和最短路就是答案,可以用记忆化搜索的方式来实现 细节:(1)注意初始化数 ...
- 封装TensorFlow神经网络
为了参加今年的软件杯设计大赛,这几个月学习了很多新知识.现在大赛的第二轮作品优化已经提交,开始对这四个月所学知识做一些总结与记录. 用TensorFlow搭建神经网络.TensorFlow将神经网络的 ...
- Java Web学习总结(10)——Session详解
摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java ...
- CCF模拟 无线网络
无线网络 时间限制: 1.0s 内存限制: 256.0MB 问题描述 目前在一个很大的平面房间里有 n 个无线路由器,每个无线路由器都固定在某个点上.任何两个无线路由器只要距离不超过 r 就能互相 ...
- Linux下安装Go环境
登录Linux Mac或Linux的用户可以用命令ssh root@xxx.xxx.xxx.xxx登录主机Window的用户可以使用SecureCRT登录主机虚拟机用户直接打开你的虚拟机 安装Go环境 ...
- cogs 50. [NOIP2002] 选数
50. [NOIP2002] 选数 ★ 输入文件:choose.in 输出文件:choose.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述]: 已知 n 个整数 ...
- vim 常用插件功能跟配置
在之前的公司,一直是使用别人配置好的vim 环境,他当时配置的功能很强大,查看源码的时候,非常的方便.至少我一直都是用它来看源码,从来没有使用过source insight.现在换了工作,但之前养成的 ...
- POJ 2323 贪心
题意: 思路: 贪 贪 贪 如果当前的c>之前的c+s 那么之前的合适 一直贪下去就好了 //By SiriusRen #include <cstdio> #include < ...