POJ 2186 Popular cows(Kosaraju+强联通分量模板)
题目链接:http://poj.org/problem?id=2186
题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为牛C是红人,那么牛A也认为牛C是红人。求被其他所有牛认为是红牛的牛的总数。
解题思路:把所有牛看成顶点,把有序对(A,B)看成从A到B的有向边,那么题目就变成了求所有顶点都可到达的顶点的总数。我们可以得到一个结论,如果一个强连通分量里有一头牛被认为是红人,那么该强联通分量里的所有牛都是红人,这显然是正确的。由于我用的是Kosaraju求强联通分量,根据该算法性质,红牛只会在拓扑序最后的强联通分量里,我只需要找到最后一块强联通分量,取其中一个顶点,看是否所有点都可以到达即可。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e4+; vector<int>G[N];//图的邻接表
vector<int>rG[N];//反向图的邻接表
vector<int>vs;//后序遍历的顺序的顶点列表
bool used[N];//记录点是否被访问
int cmp[N];//cmp[i]表示点i所属强联通分量的拓扑序 int V,E; void addedge(int u,int v){
G[u].push_back(v);
rG[v].push_back(u);
} void dfs(int v){
used[v]=true;
for(int i=;i<G[v].size();i++){
if(!used[G[v][i]])
dfs(G[v][i]);
}
//回溯前进行标号
vs.push_back(v);
} void rdfs(int v,int k){
used[v]=true;
//点v属于第k个强连通分量
cmp[v]=k;
for(int i=;i<rG[v].size();i++){
if(!used[rG[v][i]])
rdfs(rG[v][i],k);
}
} int scc(){
memset(used,false,sizeof(used));
vs.clear();
//第一次DFS
for(int i=;i<=V;i++){
if(!used[i])
dfs(i);
}
memset(used,false,sizeof(used));
int k=;//强联通分量块数
//第二次DFS
for(int i=vs.size()-;i>=;i--){
if(!used[vs[i]])
rdfs(vs[i],++k);
}
return k;
} void solve(){
//获得强联通块数
int n=scc();
//统计备选解的个数
int u=,num=;
for(int i=;i<=V;i++){
if(cmp[i]==n){
u=i;
num++;
}
}
//检查是否所有点可达
memset(used,,sizeof(used));
rdfs(u,); for(int i=;i<=V;i++){
if(!used[i]){
num=;
break;
}
}
for(int i=;i<=V;i++){
cout<<"i="<<i<<" cmp="<<cmp[i]<<endl;
}
printf("%d\n",num);
} int main(){
scanf("%d%d",&V,&E);
for(int i=;i<=E;i++){
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
}
solve();
return ;
}
POJ 2186 Popular cows(Kosaraju+强联通分量模板)的更多相关文章
- POJ 2186 Popular Cows(强联通+缩点)
Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= ...
- 强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)
poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3. 求 ...
- POJ 2186 Popular Cows(强联通分量)
题目链接:http://poj.org/problem?id=2186 题目大意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种 ...
- POJ 2186 Popular Cows (强联通)
id=2186">http://poj.org/problem? id=2186 Popular Cows Time Limit: 2000MS Memory Limit: 655 ...
- poj 2186 Popular Cows (强连通分量+缩点)
http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissi ...
- [强连通分量] POJ 2186 Popular Cows
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31815 Accepted: 12927 De ...
- POJ 2186-Popular Cows (图论-强联通分量Korasaju算法)
题目链接:http://poj.org/problem?id=2186 题目大意:有n头牛和m对关系, 每一对关系有两个数(a, b)代表a牛认为b牛是“受欢迎”的,且这种关系具有传递性, 如果a牛认 ...
- POJ 2186 Popular Cows(强连通分量缩点)
题目链接:http://poj.org/problem?id=2186 题目意思大概是:给定N(N<=10000)个点和M(M<=50000)条有向边,求有多少个“受欢迎的点”.所谓的“受 ...
- poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】
题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Sub ...
随机推荐
- 51nod 1952 栈(单调队列)
用deque实时维护栈的情况. 数加入栈顶部,删掉栈顶部的数,相当于加入一个数,删掉最早出现的数,每次求最大值,这个直接记录一下就好了. 数加入栈底部,删掉栈顶部的数,相当于加入一个数,删掉最晚出现的 ...
- 序列计数(count)
Portal -->broken qwq Description 给你一个长度为\(n\)的序列,序列中的每个数都是不超过\(m\)的正整数,求满足以下两个条件的序列数量: 1.序列中至 ...
- poj 3254 状态压缩
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15285 Accepted: 8033 Desc ...
- Linux遇到的两个问题
编译C++的和编译C语言的命令不同. 编译C++,应当先安装g++. 然后可以用#g++ filename.cpp -o filename 进行编译 编译C语言是用#gcc filename.c -o ...
- HTTP ------ connection 为 close 和 keep-alive 的区别
keep-alive和close这个要从TCP握手讲起 HTTP请求是基于TCP连接的,TCP的请求会包含(三次握手,中间请求,四次挥手)在HTTP/1.0时代,一个HTTP请求就要三次握手和四次挥手 ...
- 隐藏超出父元素的子元素的部分:overflow
overflow : 针对超出父级的内容如何显示 值: visible 默认值,超出的内容会显示出来 auto 如果内容超出了父级,那就出现滚动条.如果内容没有超出,就没有滚动条 hidden 超出的 ...
- Java设计模式の代理模式
目录 代理模式 1.1.静态代理 1.2.动态代理 1.3.Cglib代理 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是 ...
- centos7下配置mysql5.7.24主从复制
前置条件 准备两台服务器(可以是虚拟机),系统为centos7 此处演示的两台服务器:192.168.8.134.192.168.8.135 第一步:安装mysql5.7.24 先在两台服务器上安装m ...
- java学习——equals()和==的比较
equals 方法是 java.lang.Object 类的方法. 下面从两个方面来说明equals()和==的差别:(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比 ...
- Selenium/HtmlUnit设置代理获取JS生成的网页
通常我们使用Java提供的HttpURLConnection或者Apache的HttpClient获取的网页源代码都是直观可见的,其代码的内容和通过浏览器右键网页->点击查看网页源代码的内容一致 ...