题意:
n头奶牛,给出若干个欢迎关系a b,表示a欢迎b,欢迎关系是单向的,但是是可以传递的,如:a欢迎b,b欢迎c,那么a欢迎c 。另外每个奶牛都是欢迎他自己的。求出被所有的奶牛欢迎的奶牛的数目.

方法:对有向图求强连通分量,然后找出所有独立的强连通分量(所谓独立,就是该连通分量里面的点到外面的点没有通路,当然,连通分量外的点是可以有路到强连通分量内的点的),如果独立的强连通分量的数目只有一个,那么,就输出这个强连通分量内解的个数,否则输出无解。

kosaraju:

http://www.nocow.cn/index.php/Kosaraju%E7%AE%97%E6%B3%95

View Code

  1 // File Name: 2186.cpp
  2 // Author: Missa
  3 // Created Time: 2013/2/5 星期二 20:47:56
  4
  5 #include<iostream>
  6 #include<cstdio>
  7 #include<cstring>
  8 #include<algorithm>
  9 #include<cmath>
 10 #include<queue>
 11 #include<stack>
 12 #include<string>
 13 #include<vector>
 14 #include<cstdlib>
 15 #include<map>
 16 using namespace std;
 17
 18 //***********************kosaraju**************
 19 const int maxn = 1e4+5;
 20 const int maxm = 5e4+5;
 21 int n,m;
 22 vector <int> adj[maxn];//正向邻接表
 23 vector <int> radj[maxn];//反向邻接表
 24 vector <int> ord;//后续访问顺序
 25 bool vis[maxn];
 26 int ma[maxn];//表示点v属于哪个连通分量
 27 int cnt;//有向图强连通分量的个数
 28 void init()
 29 {
 30     for(int i=0;i<maxn;i++)
 31     {
 32         adj[i].clear();
 33         radj[i].clear();
 34     }
 35     ord.clear();
 36     cnt=0;
 37 }
 38 void dfs1(int v)
 39 {
 40     vis[v]=1;
 41     for(int i=0;i<adj[v].size();i++)
 42         if(!vis[adj[v][i]])
 43             dfs1(adj[v][i]);
 44     ord.push_back(v);
 45 }
 46 void dfs2(int v)
 47 {
 48     vis[v]=1;
 49     ma[v]=cnt;
 50     for(int i=0;i<radj[v].size();i++)
 51         if(!vis[radj[v][i]])
 52             dfs2(radj[v][i]);
 53 }
 54 void kosaraju()
 55 {
 56     memset(vis,0,sizeof(vis));
 57     ord.clear();
 58     for(int i=1;i<=n;i++)//顶点从1--n
 59         if(!vis[i])
 60             dfs1(i);
 61     memset(vis,0,sizeof(vis));
 62     cnt=0;
 63     for(int i=ord.size()-1;i>=0;i--)
 64         if(!vis[ord[i]])
 65         {
 66             cnt++;
 67             dfs2(ord[i]);
 68         }
 69 }
 70 //*********************************************
 71 void solve()
 72 {
 73     kosaraju();
 74     int ans[maxn];
 75     memset(vis,0,sizeof(vis));
 76     memset(ans,0,sizeof(ans));
 77     for(int i=1;i<=n;i++)
 78     {
 79         ans[ma[i]]++;//统计每个连通分量的大小
 80         for(int j=0;j<adj[i].size();j++)
 81         {
 82             int v=adj[i][j];
 83             if(ma[i] != ma[v])//有向边(i,v),若i与v不在一个连通分量
 84                 vis[ma[i]]=1;//i所在的强连通分量出度不为0.
 85         }
 86     }
 87     int flag=0,cow;
 88     for(int i=1;i<=cnt;i++)
 89     {
 90         if(!vis[i])//出度为0
 91         {
 92             cow=i;
 93             flag++;
 94         }
 95     }
 96     if(flag==1)
 97         printf("%d\n",ans[cow]);
 98     else
 99         printf("0\n");//存在多个出度为0。表明至少两组是不互相羡慕的
100 }
101 int main()
102 {
103     while(~scanf("%d%d",&n,&m))
104     {
105         init();
106         for(int i=0;i<m;i++)
107         {
108             int x,y;
109             scanf("%d%d",&x,&y);
110             adj[x].push_back(y);
111             radj[y].push_back(x);//反向边
112         }
113         solve();
114     }
115     return 0;
116 }
117
118 /*
119 3 3
120 1 2
121 2 1
122 2 3
123  * /

转载于:https://www.cnblogs.com/Missa/archive/2013/02/05/2893425.html

poj 2186(强连通分量)相关推荐

  1. poj 2186 强连通分量

    poj 2186 强连通分量 传送门 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 33414 Acc ...

  2. Popular Cows POJ 2186(强连通分解)

    原题 原题链接 题目大意 题目会给一个牛的有向图,A→B意味着A认为B流行,如果A→B,B→C,则A和B都认为C流行,要求求出这群牛中被所有牛认为流行的牛的数. 题目分析 这道题中会存在一些情况例如 ...

  3. POJ 2186 挑战 --牛红人 强连通分量——Tarjan

    题意:n头奶牛,给出若干个欢迎关系a b,表示a欢迎b,欢迎关系是单向的,但是是可以传递的,如:a欢迎b,b欢迎c,那么a欢迎c .另外每个奶牛都是欢迎他自己的.求出被所有的奶牛欢迎的奶牛的数目.#i ...

  4. POJ 2186 Popular Cows(强连通分量缩点,Tarjan算法)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=16578 [解题报告] 给你一个有向图,问你有多少个点可以被其它 ...

  5. Poj 2186 Popular Cows(Tarjan 强连通缩点)

    传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解 ...

  6. POJ 1904 【强连通分量】.cpp

    题意: 很久很久以前.. 有一个国王.. 他有好几个儿子.. 这些王子都喜欢上了邻国的公主.. 他们准备迎娶自己喜欢的公主中的一个.. 国王就让宰相给列一个清单.. 宰相就给了国王一个清单..上面写明 ...

  7. 有向图 加最少的边 成为强连通分量的证明 poj 1236 hdu 2767

    poj 1236: 题目大意:给出一个有向图, 任务一: 求最少的点,使得从这些点出发可以遍历整张图  任务二: 求最少加多少边 使整个图变成一个强连通分量. 首先任务一很好做, 只要缩点 之后 求 ...

  8. POJ 1904 King's Quest(强连通分量)

    题目链接 Description Once upon a time there lived a king and he had N sons. And there were N beautiful g ...

  9. POJ 1236 Network of Schools(强连通分量缩点求根节点和叶子节点的个数)

    Description: A number of schools are connected to a computer network. Agreements have been developed ...

最新文章

  1. linux shell bash 内置变量参考
  2. 虚拟机屏幕界面自适应调整
  3. 聚焦一切关联需求-企业数字化转型:外部驱动力之客户篇
  4. Java14:使用Java 14的新记录联接数据库表
  5. JAVA拳皇_拳皇(Java简单的小程序)代码实例|chu
  6. 映射内网ftp服务器到公网报错问题解决
  7. 数据库学习--主从复制
  8. poi 升级至4.x 的问题总结(POI Excel 单元格内容类型判断并取值)
  9. svn: E155036: Please see the ‘svn upgrade‘
  10. 四、矩阵特征值与特征向量的计算
  11. IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比
  12. MATLAB实现数图缩放:双线性内插法
  13. 排序算法——冒泡排序
  14. 影视动画专业有木有c语言,那些头秃的专业,不了解一下?
  15. Codeforces 39H - Multiplication Table(进制转换)
  16. HDU - 1546 Idiomatic Phrases Game(dijkstra最短路)
  17. 破解软件的原理是什么(软件被破解公开)
  18. printThis前端打印插件
  19. 【我的Android进阶之旅】解决魅族手机USB调试时,无法授权出现“Because an app is obscuring a permission request.”错误提示的问题
  20. Shell之function函数的定义及调用

热门文章

  1. 腐蚀rust电脑分辨率调多少_腐蚀Rust画面怎么设置 _游侠网
  2. jdom解析xml文件_JDOM编辑XML文件示例
  3. java中hashmap_Java HashMap – Java中的HashMap
  4. TestNG Eclipse插件
  5. Python __str __()和__repr __()函数
  6. Java System.arraycopy()方法示例
  7. Android BroadcastReceiver示例教程
  8. C++教程:C++开发的四重境界是什么?
  9. appium之adb常用命令
  10. 【实战】Vue 中 Props 值因异步获取导致的报错问题解析