poj 2186(强连通分量)
题意:
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
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(强连通分量)相关推荐
- poj 2186 强连通分量
poj 2186 强连通分量 传送门 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 33414 Acc ...
- Popular Cows POJ 2186(强连通分解)
原题 原题链接 题目大意 题目会给一个牛的有向图,A→B意味着A认为B流行,如果A→B,B→C,则A和B都认为C流行,要求求出这群牛中被所有牛认为流行的牛的数. 题目分析 这道题中会存在一些情况例如 ...
- POJ 2186 挑战 --牛红人 强连通分量——Tarjan
题意:n头奶牛,给出若干个欢迎关系a b,表示a欢迎b,欢迎关系是单向的,但是是可以传递的,如:a欢迎b,b欢迎c,那么a欢迎c .另外每个奶牛都是欢迎他自己的.求出被所有的奶牛欢迎的奶牛的数目.#i ...
- POJ 2186 Popular Cows(强连通分量缩点,Tarjan算法)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=16578 [解题报告] 给你一个有向图,问你有多少个点可以被其它 ...
- Poj 2186 Popular Cows(Tarjan 强连通缩点)
传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解 ...
- POJ 1904 【强连通分量】.cpp
题意: 很久很久以前.. 有一个国王.. 他有好几个儿子.. 这些王子都喜欢上了邻国的公主.. 他们准备迎娶自己喜欢的公主中的一个.. 国王就让宰相给列一个清单.. 宰相就给了国王一个清单..上面写明 ...
- 有向图 加最少的边 成为强连通分量的证明 poj 1236 hdu 2767
poj 1236: 题目大意:给出一个有向图, 任务一: 求最少的点,使得从这些点出发可以遍历整张图 任务二: 求最少加多少边 使整个图变成一个强连通分量. 首先任务一很好做, 只要缩点 之后 求 ...
- 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 ...
- POJ 1236 Network of Schools(强连通分量缩点求根节点和叶子节点的个数)
Description: A number of schools are connected to a computer network. Agreements have been developed ...
最新文章
- linux shell bash 内置变量参考
- 虚拟机屏幕界面自适应调整
- 聚焦一切关联需求-企业数字化转型:外部驱动力之客户篇
- Java14:使用Java 14的新记录联接数据库表
- JAVA拳皇_拳皇(Java简单的小程序)代码实例|chu
- 映射内网ftp服务器到公网报错问题解决
- 数据库学习--主从复制
- poi 升级至4.x 的问题总结(POI Excel 单元格内容类型判断并取值)
- svn: E155036: Please see the ‘svn upgrade‘
- 四、矩阵特征值与特征向量的计算
- IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比
- MATLAB实现数图缩放:双线性内插法
- 排序算法——冒泡排序
- 影视动画专业有木有c语言,那些头秃的专业,不了解一下?
- Codeforces 39H - Multiplication Table(进制转换)
- HDU - 1546 Idiomatic Phrases Game(dijkstra最短路)
- 破解软件的原理是什么(软件被破解公开)
- printThis前端打印插件
- 【我的Android进阶之旅】解决魅族手机USB调试时,无法授权出现“Because an app is obscuring a permission request.”错误提示的问题
- Shell之function函数的定义及调用
热门文章
- 腐蚀rust电脑分辨率调多少_腐蚀Rust画面怎么设置 _游侠网
- jdom解析xml文件_JDOM编辑XML文件示例
- java中hashmap_Java HashMap – Java中的HashMap
- TestNG Eclipse插件
- Python __str __()和__repr __()函数
- Java System.arraycopy()方法示例
- Android BroadcastReceiver示例教程
- C++教程:C++开发的四重境界是什么?
- appium之adb常用命令
- 【实战】Vue 中 Props 值因异步获取导致的报错问题解析