思路:因为奶牛的爱慕关系具有传递性,所以每个环(强连通分量)里的奶牛是互相喜欢的。那么我们可以用到Tarjan算法把每个强连通分量找出,并缩点,把每个强连通分量都缩成一个点(当前缩点里的奶牛都是互相喜欢的)。这样一来,这个图就变成了一个DAG(有向无环图)。然后我们只需要统计每个缩点的出度就好了,如果一个点有出度&&我们知道这个图是一个DAG,所以这个强连通分量(这个缩点)里的奶牛就不可能被这个缩点所连出去的缩点里的奶牛所喜欢(这是无环图——DAG)。综上所述,我们只需要统计一下有多少个没有出度的强连通分量就好了,但有多个没有出度的强连通分量也不行,因为这样就会有两多群群奶牛不喜欢别的奶牛,使得奶牛们无法收到其他奶牛(这多群奶牛)的喜欢,这样就不行了 。

画一张图形象一下:

code :

 #include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int MAX = 5e4 + ;
stack < int > pru;
int n, m, low[MAX], dfn[MAX], head[MAX], vis[MAX], col[MAX], sum[MAX], color, num, z, out[MAX], ans, cnt;
struct node
{
int next, to;
}stu[MAX];
inline void add(int x, int y)
{
stu[++num].next = head[x];;
stu[num].to = y;
head[x] = num;
return;
}
inline void tarjan(int u)//Tarjan算法模板,这里用于缩点
{
low[u] = dfn[u] = ++z;
vis[u] = ;
pru.push(u);
for(register int i = head[u]; i; i = stu[i].next)
{
int k = stu[i].to;
if(!vis[k])
{
tarjan(k);
low[u] = min(low[u], low[k]);
}
else if(!col[k])
{
low[u] = min(low[u], dfn[k]);
}
}
if(low[u] == dfn[u])
{
col[u] = ++color;
++sum[color];//当前强连通分量里的奶牛的个数++
while(pru.top() != u)
{
col[pru.top()] = color;
++sum[color];//当前强连通分量里的奶牛的个数++
pru.pop();
}
pru.pop();
}
return;
}
signed main()
{
scanf("%d %d", &n, &m);
for(register int i = , x, y; i <= m; ++i)
{
scanf("%d %d", &x, &y);
add(y, x);//建反向边,把统计出度变为统计入度,更加方便一些
}
for(register int i = ; i <= n; ++i)
{
if(!vis[i])
{
tarjan(i);
}
}
for(register int u = ; u <= n; ++u)//循环每个结点的出度(这里是入度,因为建的是反向边)
{
for(register int i = head[u]; i; i = stu[i].next)
{
int k = stu[i].to;//因为建的是反向边,所以i其实是k的出度
if(col[k] != col[u])//颜色不相同就代表不在一个强连通分量里
{
++out[col[k]];//所以k的颜色(及包含k的那个强连通分量)就不能选了(这里标记为出度++),至于为什么思路里有讲
}
}
}
for(register int i = ; i <= color; ++i)//枚举每种颜色(每个强连通分量)
{
if(!out[i])//要是没有出度(及当前强连通分量中没有奶牛喜欢别的奶牛)
{
++cnt;//记录有几个强连通分量的缩点没有出度
ans = sum[i];//注意,这里是sum[i],因为i点只是当前强连通分量的缩点,真正被所有奶牛都喜欢的奶牛个数其实是这个强连通分量的大小(及当前强连通分量中奶牛的个数)
}
}
if(cnt == )//必须只有一个强连通分量没有出度,如果有多个也不行,因为这样那两个强连通分量里的奶牛都是不互相喜欢的
{
printf("%d", ans);
}
else
{
printf("");//没有奶牛被所有奶牛喜欢
}
return ;
}

洛谷 P2341 【受欢迎的牛】的更多相关文章

  1. HAOI2006 (洛谷P2341)受欢迎的牛 题解

    HAOI2006 (洛谷P2341)受欢迎的牛 题解 题目描述 友情链接原题 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之 ...

  2. 洛谷P2341受欢迎的牛

    传送门啦 这是一个tarjan强连通分量与出度结合的例题. 先明确一下题意,如果这个点(缩点之后的)没有出度,这个点才能成为明星牛(明星牛的定义是:所有牛都喜欢他才可以). 由于我们进行了缩点,所以我 ...

  3. 洛谷 [P2341] 受欢迎的牛

    强连通分量 一个结论: 在有向图中, 一个联通块能被所有点遍历当且仅当图中只有一个连通块出度为零 #include <iostream> #include <cstdio> # ...

  4. 【题解】洛谷P2341 [HAOI2006]受欢迎的牛(强连通分量)

    洛谷P2341:https://www.luogu.org/problemnew/show/P2341 前言 这题看错题目 足足花了将近5小时提交了15次 在一位dalao的提醒下才AC了 记得要看清 ...

  5. 洛谷 P2341 [HAOI2006]受欢迎的牛 解题报告

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢&q ...

  6. 洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows

    P2341 [HAOI2006]受欢迎的牛/POJ2186:Popular Cows 题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所 ...

  7. 洛谷P2341 [HAOI2006]受欢迎的牛 (Tarjan,SCC缩点)

    P2341 [HAOI2006]受欢迎的牛|[模板]强连通分量 https://www.luogu.org/problem/P2341 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就 ...

  8. 【模板】Tarjan缩点,强连通分量 洛谷P2341 [HAOI2006]受欢迎的牛 [2017年6月计划 强连通分量01]

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...

  9. 【洛谷P2341】受欢迎的牛

    受欢迎的牛 题目描述 一些可以当明星的牛,一定会构成一个强连通分量,我们可以先缩点,最后统计一下出度为零的强连通分量大小即可, 若出度为零的强连通分量个数大于1,则输出0 #include<io ...

随机推荐

  1. 《CSS3知识点》

    一.引入样式 1.行内样式表 <h1 style="color: red;font-size: 18px;">10-30</h1> 2.内部样式表(在hea ...

  2. JS面向对象编程(三):非构造函数的继承

    一.什么是"非构造函数"的继承?            现在有一个对象,叫"中国人".            var Chinese = {           ...

  3. 机器学习经典分类算法 —— k-均值算法(附python实现代码及数据集)

    目录 工作原理 python实现 算法实战 对mnist数据集进行聚类 小结 附录 工作原理 聚类是一种无监督的学习,它将相似的对象归到同一个簇中.类似于全自动分类(自动的意思是连类别都是自动构建的) ...

  4. 【iOS】UIAlertView 点击跳转事件

    iOS 开发中,UIAlertView 经常用到.这里记录下曾用到的点击跳转事件. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@& ...

  5. ansible-service

    #service#查询服务状态 ansible server01 -m service -a "name=httpd state=started" #停止服务 ansible se ...

  6. Code blocks返回错误代码:Process returned -1073741819 (0xC0000005)

    循环语句访问链表时,返回了错误代码: 逐项排查后,发现是由while循环引起的: 附上出错代码: do{ L=L->post; printf("%05d %d %05d\n" ...

  7. How to check all timestamps of a file

    A friend of mine she asked me how to check all timestamps of a file on an NTFS volume. She did not h ...

  8. 第二十二章 跳出循环-shift参数左移-函数的使用 随堂笔记

    第二十二章 跳出循环-shift参数左移-函数的使用 本节所讲内容: 22.1 跳出循环 22.2 Shift参数左移指令 22.3 函数的使用 22.4 实战-自动备份mysql数据库和nginx服 ...

  9. C# Winform 自定义控件——竖着的Navbar

    效果: 描述: 这是一个可折叠的菜单导航,主要是由panel.picturebox.label完成,界面的颜色用来区分一下各个组合控件,便于调试. 首先,首先是ImageButton: 这个是由Pic ...

  10. 图片格式:gif / png / pg / webp 介绍

    本文引自:https://www.cnblogs.com/changyangzhe/articles/5718285.html GIF介绍 GIF 意为Graphics Interchange for ...