Popular Cows
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 41771   Accepted: 16955

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

 
 
如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。
 
在此题 要求被其他所有的牛崇拜的牛的数量 例如 
1 崇拜2
2 崇拜3
3 崇拜2
那么答案就是2 ,   2和3马被其它所有的节点崇拜, 是一个强连通分量
 
学习了这个博客

再Tarjan算法中,有如下定义。

DFN[ i ] : 在DFS中该节点被搜索的次序(时间戳)

LOW[ i ] : 为i或i的子树能够追溯到的最早的栈中节点的次序号

当DFN[ i ]==LOW[ i ]时,为i或i的子树可以构成一个强连通分量。

觉得叫color好点 给节点染色 有多少种颜色就有多少个强连通分量 同种颜色的节点处于同一个强连通分量

借这个图说明一下染色

为了打字 以下缩写DFN=LOW为条件

首先DFS 栈里面有1 3 5 6

到第六个节点  已经到达DFS最深处 满足条件 染成棕色 栈里面有1 3 5

返回到5 满足条件 染成橙色 栈里面有1 3

到3

再到4 4可以到1  但是不满足!dfn[v] ,  它满足!color[v], low[id] = min(low[id], dfn[v]); low[4] = 1, 不满足条件 栈里面有 1 3 4

回到3 low[id] = min(low[id], low[v]); low[3] = 1, 不满足条件 栈里面有 1 3 4

到1

再到2 2可以到4  但是不满足!dfn[v] ,  它满足!color[v], low[id] = min(low[id], dfn[v]); low[2] = 5, 不满足条件 栈里面有 1 3 4 2

再回到1 满足条件 把栈里面的都拿出来染成蓝色 完毕

注意要反向建图(是这样子叫么?)

#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
int N, M;
using namespace std; const int si = 10010;
vector<int> G[si];
int dfn[si], low[si], color[si], size[si], stk[si];
bool flag[si]; int timelag, colorcnt, stksize;
void tarjan(int id) {
dfn[id] = low[id] = ++timelag;
stk[stksize++] = id;
for (int i = 0; i < G[id].size(); i++) {
int v = G[id][i];
if (!dfn[v]) {//dfn也是vis的标志 是否来过
tarjan(v);
low[id] = min(low[id], low[v]);
}
else if (!color[v]) {
low[id] = min(low[id], dfn[v]);
}
}
if (dfn[id] == low[id]) {//染色
int cnt = 0;
colorcnt++;
while (stksize) {
stksize--;
int x = stk[stksize];
color[x] = colorcnt;
cnt++;
if (x == id) break;
}
size[colorcnt] = cnt;
}
}
int main() {
cin >> N >> M;
while (M--) {
int a, b;
scanf("%d %d", &a, &b);
G[b].push_back(a);//反向建图
}
for (int i = 1; i <= N; i++) {
if (!dfn[i]) tarjan(i);//求强连通分量 dfn也是vis的标志
} for (int i = 1; i <= N; i++) {
for (int j = 0; j < G[i].size(); j++) {
int x = G[i][j];//i到x的边 但是他们不是同一个颜色的 上图的3和5是这种关系
if (color[i] != color[x]) flag[color[x]] = 1;
//x崇拜i 则x所处的强连通分量都崇拜i 所有与x颜色相同的都崇拜i
//但是i不崇拜x 否则i和x是同一个强连通分量同一种颜色了 所以扩大到整个x的颜色
}
}
int num = 0, ans = 0;
for (int i = 1; i <= colorcnt; i++) {
if (flag[i]) continue;
num++;
ans = size[i];
}
if (num != 1) ans = 0;//只会有一个被其它所有牛崇拜的强连通分量
cout << ans << endl;
return 0;
}

2186 Popular Cows的更多相关文章

  1. poj 2186 Popular Cows (强连通分量+缩点)

    http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissi ...

  2. POJ 2186 Popular Cows (强联通)

    id=2186">http://poj.org/problem? id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 655 ...

  3. poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】

    题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Sub ...

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

    poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3. 求 ...

  5. poj 2186 Popular Cows

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29908   Accepted: 12131 De ...

  6. POJ 2186 Popular Cows(Targin缩点)

    传送门 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31808   Accepted: 1292 ...

  7. [强连通分量] POJ 2186 Popular Cows

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31815   Accepted: 12927 De ...

  8. POJ 2186 Popular Cows(强连通)

                                                                  Popular Cows Time Limit: 2000MS   Memo ...

  9. poj 2186 Popular Cows【tarjan求scc个数&&缩点】【求一个图中可以到达其余所有任意点的点的个数】

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27698   Accepted: 11148 De ...

随机推荐

  1. Centos6与Centos7安装和使用htop

    Centos6 安装 rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm r ...

  2. Linux 配置ssh 免密码登录

    在平常应用中,我们经常会登录到其他主机,比如说服务器,每次都需要用户名和密码. 我们可以通过ssh免密码登录服务器而不需要输入密码. 现在有一台ubuntu的阿里云服务器,称之为 server.  公 ...

  3. 为二级域名注册ssl证书,并强制使用https对http进行跳转

    服务器上仍然使用nginx进行代理 1.为二级域名申请ssl证书,如blog.yourdomain.com,见前文. 2.在域名解析服务中,为二级域名添加解析记录 3.nginx默认读取/etc/ng ...

  4. raid10模型比raid01模型的冗余度高

    RAID10和RAID01的冗余度看起来差不多,但本质上有一定的区别. RAID10:左边损坏1块盘,右边还可以容忍一块盘损坏而不影响整体的数据;冗余度=2 RAID01:左边损坏1块盘,此时左边已经 ...

  5. ThreadLocal之我所见

    网上有很多关于ThreadLocal的文章,大部分都提到了多线程之间共享资源的问题.其实ThreadLocal和多线程之间一点关系都没有.如果有,我怕是它的名字改成ThreadShare是不是更合适呢 ...

  6. Python运行时的常见错误

    1)忘记在 if , elif , else , for , while , class ,def 声明末尾添加冒号(:)(导致 “SyntaxError :invalid syntax”) 2)使用 ...

  7. git常用命令学习笔记

    安装好git之后即可使用git来管理项目了,鼠标右键点击 git bash出现命令黑窗口,接下来执行git指令即可. https://git-scm.com/book/zh/v2 以下整理了git常用 ...

  8. RockerMQ实战之快速入门

    文章目录 RocketMQ 是什么 专业术语 Producer Producer Group Consumer Consumer Group Topic Message Tag Broker Name ...

  9. MySQL 必知必会学习笔记(常用命令二)

    CREATE TABLE students(student_id INT UNSIGNED, name VARCHAR(30), sex CHAR(1), birth DATE, PRIMARY KE ...

  10. ESP32搭建3.ubuntu14.04下搭建esp32开发环境 (10-5)

    硬件为乐鑫出品的ESP32一款集成了wifi和蓝牙的集成模块. 1.首先ctrl+alt+t打开终端,sudo -s选择用root权限登陆 . 2. 输入指令:sudo apt-get install ...