POJ 2186 Kosaraju算法 强连通分量

原创 2016年08月30日 21:33:03

Popular Cows
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 30842 Accepted: 12529
Description

Every cow’s dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M <= 50,000) ordered pairs of the form (A, B) that tell you that cow A thinks that cow B is popular. Since popularity is transitive, if A thinks B is popular and B thinks C is popular, then A will also think that C is
popular, even if this is not explicitly specified by an ordered pair in the input. Your task is to compute the number of cows that are considered popular by every other cow.
Input

  • Line 1: Two space-separated integers, N and M

  • Lines 2..1+M: Two space-separated numbers A and B, meaning that A thinks B is popular.
    Output

  • Line 1: A single integer that is the number of cows who are considered popular by every other cow.
    Sample Input

3 3
1 2
2 1
2 3
Sample Output

1
Hint

Cow 3 is the only cow of high popularity.
Source

USACO 2003 Fall

//http://poj.org/problem?id=2186


//先对原图G进行dfs搜索,得到各个点搜索完成的顺序,之后对逆图H进行dfs搜索,从最晚完成搜索的点开始,删除记录能够遍历到的点,这些点构成一个强连通分量.得到所有强连通分量后,把他们各自抽象成一个点,形成一个有向无环图,在该图上寻找出度为0的点.如果仅有一个出度为0的点,则该点被所有点指向,答案为该强连通分量的大小.如果有多个出度为0的点,则这些点无法互相可达,无解,答案为0.
//有向无环图(DAG)保证至少存在一个出度为0的点.
#include <stdio.h>
#include <string>
#include <cstring>
#include <queue>
#include <algorithm>
#include <functional>
#include <vector>
#include <iomanip>
#include <math.h>
#include <iostream>
#include <sstream>
#include <stack>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
const int MAX=10005;
int N,M,a,b,Cnt;
int Num[MAX],Tree[MAX],OutDgree[MAX];
vector<int> G[MAX],H[MAX],F;
bool Mark1[MAX],Mark2[MAX];
void dfs1(int x)
{
    Mark1[x]=true;
    for (int i=0; i<(int)G[x].size(); i++)
        if (!Mark1[G[x][i]])
            dfs1(G[x][i]);
    F.push_back(x);
}
void dfs2(int x)
{
    Mark2[x]=true;
    Num[x]=Cnt;         //点x的连通分量编号为Cnt
    Tree[Cnt]+=1;      //编号为Cnt的连通分量大小+1
    for (int i=0; i<(int)H[x].size(); i++)
        if (!Mark2[H[x][i]])
            dfs2(H[x][i]);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    while (cin>>N>>M)
    {
        memset(Mark1,false,sizeof(Mark1));
        memset(Mark2,false,sizeof(Mark2));
        memset(Num,0,sizeof(Num));
        memset(Tree,0,sizeof(Tree));
        memset(OutDgree,0,sizeof(OutDgree));
        Cnt=0;
        F.clear();
        for (int i=0; i<MAX; i++)
        {
            G[i].clear();
            H[i].clear();
        }
        for (int i=0; i<M; i++)
        {
            cin>>a>>b;
            G[a].push_back(b);
            H[b].push_back(a);
        }
        for (int i=1; i<=N; i++)
        {
            if (!Mark1[i])
                dfs1(i);
        }
        for (int i=(int)F.size()-1; i>=0; i--)
        {
            if (!Mark2[F[i]])
            {
                Cnt++;
                dfs2(F[i]);
            }
        }
        for (int i=1;i<=N;i++)
        {
            for (int j=0;j<(int)G[i].size();j++)
            {
                if (Num[i]!=Num[G[i][j]])
                    OutDgree[Num[i]]+=1;
            }
        }
        int temp=0,Ans=0;
        for (int i=1;i<=Cnt;i++)
        {
            if (!OutDgree[i])
                temp++,Ans=i;
        }
        cout<<(temp>1?0:Tree[Ans])<<endl;
    }
    return 0;
}
版权声明:转载请注明出处

相关文章推荐

poj 2186(强连通分量的kosaraju算法)

Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23420   ...
  • my_acm
  • my_acm
  • 2014年08月18日 20:59
  • 455

poj2186 Popular Cows--Kosaraju算法 & 缩点 & 强连通分量

原题链接:http://poj.org/problem?id=2186 题意:n头牛,标号1到n,m对关系,接下来m行,每行两个数字a和b代表牛a认为牛b受瞩目,当然如果同时牛b认为牛c也受...
  • LaoJiu_
  • LaoJiu_
  • 2016年09月09日 15:53
  • 207

强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)

poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且可以传递, 即1欢迎2不代表2欢迎1, 但是如果2也欢迎3那么1也欢迎...
  • whai362
  • whai362
  • 2015年07月20日 10:25
  • 615

[ACM] POJ 2186 Popular Cows (强连通分量,Kosaraju算法知识整理)

首先是一些知识整理:来源于网络: 以下转载于:http://blog.sina.com.cn/s/blog_4dff87120100r58c.html   Kosaraju算法是求解有向图强...

poj 2186 Popular Cows(强连通分量,tarjan或Kosaraju)

题目地址:点击打开链接 题意: 给定一些有向路,求有多少个点可以由其余的任意点到达 思路: 第一道强连通分量题,照着白书写的。 最后判断拓扑排序最后一个强连通分量是否可行看到两种方法,白书是对最...
  • CillyB
  • CillyB
  • 2017年02月22日 19:49
  • 208

POJ-2186 Popular Cows (强连通分量[Kosaraju])

初次接触这方面的图论,知道的太少了,还不能看出如何转换,只能根据题解慢慢学习 要做这题首先得了解一个定理:DAG中唯一出度为0的点,一定可以由任何点出发均可达(由于无环,所以从任何点出发往前走,必然终...

POJ 2186 Popular Cows 强连通分量 Kosaraju or tarjan

题目大意是:在一个牧群中,有N个奶牛,给定M对关系(A,B)表示A仰慕B,而且仰慕关系有传递性,问被所有奶牛(除了自己)仰慕的奶牛个数 因为仰慕关系具有传递性,因此在一个强连通分量中,每个奶牛都被分...

poj1236 Network of Schools--Kosaraju算法 & 缩点 & 强连通分量

原题链接:http://poj.org/problem?id=1236 题意:n个学校,给定n行,第i行代表i学校到其他学校是可传输的,单向。问题1:初始至少需要向多少个学校发放软件,使得网...
  • LaoJiu_
  • LaoJiu_
  • 2016年09月10日 10:01
  • 474

poj2553 The Bottom of a Graph--Kosaraju算法 & 缩点 & 强连通分量

原题链接:http://poj.org/problem?id=2553 题意:n个点,m对点的关系,定义link点:一个点u所能到达的点,反过来都能到达u,那么点u就是link点。升序输出所...
  • LaoJiu_
  • LaoJiu_
  • 2016年09月10日 14:38
  • 232

POJ2186 Popular Cows 【裸缩环+Gabow算法强连通分量分解再建图】

这题比较裸,根据牛的膜拜情况建图,然后强连通分量处理,处理后再建新图,记录出度入度,找出所有出度为0的,如果有2个及以上的,则输出(0),很简单,不可能有被所有牛膜拜的牛了(因为这几个结点互相不可达)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2186 Kosaraju算法 强连通分量
举报原因:
原因补充:

(最多只允许输入30个字)