博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2186
阅读量:5966 次
发布时间:2019-06-19

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

题意

A -> B表示 A 认为 B是红人,且如果 B -> C,则 A -> C。问有几头牛被所有牛都认为是红人。

分析

如果A被所有牛认为是红人,那么A所在的强连通分量里的牛也被所有牛认为是红人。

至多只有一个强连通分量满足满足题目的条件。(否则这两个强连通分量合并,仍然是一个强连通分量)
按照Kosaraju算法 求强连通分量时,能够得到各个强连通分量拓扑排序后的顺序,而唯一能成为解的只有拓扑排序最后的连通分量,
(如果存在这样的强连通分量,那么一定会在第一个DFS中就找到(所有牛都认为它是红人),而由于rDFS逆序遍历,所以编号最大的就是那个强连通分量了。)

code

#include 
#include
#include
#include
#include
#include
using namespace std;const int MAXN = 1e4 + 10;int n, m; // 点、边int vis[MAXN];int flag[MAXN]; // 所属强连通分量的拓扑序vector
G[MAXN], rG[MAXN];vector
vs; // 后序遍历顺序的顶点列表void addedge(int x, int y){ G[x].push_back(y); // 正向图 rG[y].push_back(x); // 反向图}void dfs(int u){ vis[u] = 1; for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(!vis[v]) dfs(v); } vs.push_back(u);}void rdfs(int u, int k){ vis[u] = 1; flag[u] = k; for(int i = 0; i < rG[u].size(); i++) { int v = rG[u][i]; if(!vis[v]) rdfs(v, k); }}int scc() // 强连通分量的个数{ vs.clear(); memset(vis, 0, sizeof vis); for(int i = 1; i <= n; i++) // [1...n] if(!vis[i]) dfs(i); memset(vis, 0, sizeof vis); int k = 0; for(int i = vs.size() - 1; i >= 0; i--) if(!vis[vs[i]]) rdfs(vs[i], k++); return k;}int solve(){ int cnt = scc(), num = 0, u = 0; for(int i = 1; i <= n; i++) if(flag[i] == cnt - 1) { num++; u = i; } memset(vis, 0, sizeof vis); rdfs(u, 0); for(int i = 1; i <= n; i++) if(!vis[i]) num = 0; return num;}int main(){ while(~scanf("%d%d", &n, &m)) { for(int i = 0; i <= n; i++) { G[i].clear(); rG[i].clear(); } for(int i = 0; i < m; i++) { int x, y; scanf("%d%d", &x, &y); addedge(x, y); } printf("%d\n", solve()); } return 0;}

转载于:https://www.cnblogs.com/ftae/p/6791260.html

你可能感兴趣的文章
C++ Error: error LNK2019: unresolved external symbol
查看>>
Bitmap 和Drawable 的区别
查看>>
Java操作mongoDB2.6的常见API使用方法
查看>>
如何给服务器设置邮件警报。
查看>>
CEF js调用C#封装类含注释
查看>>
麦克劳林
查看>>
Eclipse SVN修改用户名和密码
查看>>
架构师的职责都有哪些?
查看>>
SVN: bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7
查看>>
jsp内置对象作业3-application用户注册
查看>>
android115 自定义控件
查看>>
iOS uuchart 用法
查看>>
c# 多线程 调用带参数函数
查看>>
JQuery 如何选择带有多个class的元素
查看>>
The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
查看>>
VS快速生成JSON数据格式对应的实体
查看>>
Word2vec 模型载入(tensorflow)
查看>>
Linux内核——定时器和时间管理
查看>>
J2EE之初识JSP
查看>>
RabbitMq消息序列化简述
查看>>