博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图论-强连通分量 poj-2186
阅读量:4114 次
发布时间:2019-05-25

本文共 998 字,大约阅读时间需要 3 分钟。

题目描述:

给定一个N头牛的牛群,和M个关系(A,B),其中牛A认为牛B是红人,该关系具有传递性,所以A认为B是红人,B认为C是红人,则A也认为C是红人,现在要求被所有牛都认为是红人的牛的数量。

思路:

  可以把这个题看做是强连通分量的题目来做,其中若一些牛被其他所有的牛都认为是红人,则他们肯定属于同一个强连通分量里面(因为他们彼此都认为是红人)而且在所有的关系里面最多有一个强连通分量,因为他们只要是被其他人都认作是红人,他们肯定属于同一个强连通分量里面,所以此时我们只需要找出那个强连通分量,然后看看是不是和其他牛可达即可。

代码如下:

#include 
#include
#include
#include
#include
using namespace std;const int MAXN=10050;vector
G[MAXN];//正向关系vector
rG[MAXN];//反向关系vector
vs;//记录每一个新开始的结点int vis[MAXN];//标记是否访问过int cmp[MAXN];//记录在第几个强连通分量里面void bfs(int x)//正向BFS{ vis[x]=1; for(int i=0; i
=0; i--) { if(!vis[vs[i]]) rbfs(vs[i],k++); } int num=0,u; for(int i=1; i<=n; i++) { if(cmp[i]==k-1)//因为最多只有一个强连通分量,所以如果这个强连通分量存在的话,也一定是在第(k-1)个, { u=i;//因为在访问到这个强连通分量的时候,他可以把剩下所有没访问到的结点都访问过,因为其他点到这个强连通分量都是可达的。 num++; } } memset(vis,0,sizeof(vis)); rbfs(u,1); for(int i=1; i<=n; i++) { if(!vis[i]) { num=0; break; } } printf("%d\n",num); return 0;}

转载地址:http://mygsi.baihongyu.com/

你可能感兴趣的文章
【C#】利用Conditional属性完成编译忽略
查看>>
DirectX11 光照演示示例Demo
查看>>
VUe+webpack构建单页router应用(一)
查看>>
Node.js-模块和包
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
PHP 7 的五大新特性
查看>>
深入了解php底层机制
查看>>
PHP中的stdClass 【转】
查看>>
XHProf-php轻量级的性能分析工具
查看>>
OpenCV gpu模块样例注释:video_reader.cpp
查看>>
OpenCV meanshift目标跟踪总结
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
听说玩这些游戏能提升编程能力?
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
Mysql复制表以及复制数据库
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>