正题

题目链接


大意

有n头奶牛,奶牛们会认为有些奶牛很受欢迎,受欢迎会互相传递,如:如果A认为B很受欢迎,而B认为C受欢迎,那么A也会认为C是受欢迎的。然后求每一个奶牛都认为受欢迎的奶牛数量。


解题思路

先用tarjan算法算一遍联通分量,然后如果该联通分量出度为0且是唯一一个为0的,那么这个强联通分量里就是受每个奶牛欢迎的。

讲解一下原理:
首先我们假设这道题有解,那么我们将每一个强联通分量看做一个整体,然后如果该整体有出度那么说明这不是最受欢迎的(因为如果受到出度链接的那个整体欢迎的话那么就应该是一个联通分量里的)。如果有两个出度为0那么这两个整体就不会互相喜欢,就无解。


代码

#include<cstdio>
#include<stack>
using namespace std;
stack<int> Stack;
struct line{int h,t,next;
};
int n,m,dfn[10001],low[10001],stn,ls[10001],ltn,lt[10001];
int ltm[10001],wr[10001],s1,ans;
bool instack[10001];
line a[50001];
void tarjan(int x)
{dfn[x]=low[x]=++stn;instack[x]=true;Stack.push(x);//入栈int y;for (int q=ls[x];q;q=a[q].next)//枚举连接到{y=a[q].t;if (!dfn[y])//如果没用计算{tarjan(y);//计算low[x]=min(low[x],low[y]);//更新low值}else if (instack[y] && low[x]>dfn[y])low[x]=dfn[y];}if (dfn[x]==low[x]){ltn++;while (Stack.size()>0){y=Stack.top();Stack.pop();ltm[ltn]++;lt[y]=ltn;if (y==x) break;}//归入同一个强连通分量}
}
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=m;i++){scanf("%d%d",&a[i].h,&a[i].t);a[i].next=ls[a[i].h];ls[a[i].h]=i;}for (int i=1;i<=n;i++)if (dfn[i]==0) tarjan(i);//跑一遍for (int i=1;i<=m;i++)if (lt[a[i].t]!=lt[a[i].h]){wr[lt[a[i].h]]++;}//计算每个强连通的出度for (int i=1;i<=ltn;i++)if (!wr[i]){ans=i;s1++;//计算出度为0的数量}if (s1==1) printf("%d",ltm[ans]);else printf("0");
}

POJ2186-Popular Cows(流行的奶牛)【tarjan,强连通分量,图论】相关推荐

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

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

  2. 【tarjan强连通分量】洛谷P1726 上白泽慧音

    [tarjan强连通分量]洛谷P1726 上白泽慧音 题目传送门 妥妥的强连通模板啊(详细解释戳这里) #include <bits/stdc++.h> #define MAXN 5005 ...

  3. 2021.8.9【提高B组模拟1】T2 QYQ在艾泽拉斯(Tarjan强连通分量)(并查集)

    QYQ在艾泽拉斯 题目大意 输入样例 3 2 1 2 3 1 1 2 1 0 输出样例 4 样例说明: QYQ从3号点开始,走到2号点,最后走到1号点,结束旅程,共获得1+2+1=4价值的宝物 题目数 ...

  4. POJ2186 Popular Cows【Tarjan】【强连通分量】

    题目连接: http://poj.org/problem?id=2186 题目大意: 每头奶牛都希望自己成为最欢迎的那头牛.给你N头牛,M个崇拜关系(A,B).意思是牛A 崇拜牛B.特别是,如果牛A崇 ...

  5. POJ2186:Popular Cows(tarjan+缩点)

    题目解析: 这题题意没什么好说的,解法也挺简单的,只要会tarjan算法+只有一个出度为0的强连通分量题目有解这题就迎刃而解了. #include <iostream> #include ...

  6. Tarjan 强连通分量

    强连通分量 图中找到一个最大的子图,使得子图中任意两个节点相互到达. 一个点也是一个强连通分量 Tarjan 构成强连通分量是必定是dfs树的一棵子树,在对树进行dfs的时候记录访问时间dfn和以该节 ...

  7. Strongly connected HDU - 4635(tarjan+强连通分量)

    题意: 给一个简单有向图,让你加最多的边,使他还是一个简单有向图. 题目: Give a simple directed graph with N nodes and M edges. Please ...

  8. bzoj1051: [HAOI2006]受欢迎的牛(tarjan强连通分量)

    强连通缩下点,出度为0有多个答案为0,否则答案为出度为0的强连通分量中点的个数. 发现一道tarjan模板题,顺便复习一波tarjan #include<iostream> #includ ...

  9. P3387 【模板】缩点 Tarjan强连通分量/树上dp

    P3387 [模板]缩点 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 首先,什么是强连通分量 极大强连通子图 叫做强连通分量             首先要明确,         ...

最新文章

  1. 【nacos】本机电脑、服务器上如何安装配置nacos
  2. 百度地图API二次开发小经验分享
  3. Eclipse安装反编译插件
  4. iOS开发系列文章(持续更新……)
  5. Windows下PHP多线程扩展pthreads的安装
  6. IoT Studio可视化搭建平台编辑历史功能的思考与探索
  7. (转)Spring使用AspectJ进行AOP的开发:注解方式
  8. 利用bobo-browse 实现lucene的分组统计功能
  9. 计算机网络学习笔记(15. OSI参考模型③、TCP/IP参考模型)
  10. Linux系统关机重启,登录root用户,图形界面和字符界面,创建用户,删除用户,查看虚拟控制台用户,切换虚拟控制台
  11. Web开发——问题:js/css文件修改提交后,没有效果
  12. rebar3 的使用
  13. Luogu1005 矩阵取数游戏
  14. 自己动手写操作系统之1:bochs初步使用
  15. 西门子界面官方精美触摸屏+WINCC程序模板 西门子官方触摸屏程序模板,炫酷的扁平式动画效果
  16. 【AGC031E】Snuke the Phantom Thief(费用流)
  17. java拆弹,CSAPP lab2 二进制拆弹 binary bombs phase_2
  18. 哪个dns服务器延迟最低,可以立即测出延迟最小的DNS
  19. B-Spline曲线的导数
  20. Cesium深入浅出之视频投影

热门文章

  1. antd request 通过jsessionid传参数_Umi-request源码阅读
  2. java junit4_JUnit4使用Java5中的单元测试
  3. mysql视图实现的_mysql视图是什么?怎么实现?
  4. vscode 快速调到定义处_vim技巧:在程序代码中快速跳转,在文件内跳转到变量定义处...
  5. freertos源码详解与应用开发 pdf_互联网企业面试必问Spring源码?搞定Spring源码,看完这篇就够了...
  6. python最大值_Python 获取最大值函数|python3教程|python入门|python教程
  7. python连接mongodb数据库_python连接mongodb操作数据示例(mongodb数据库配置类)
  8. java并发之线程池
  9. [蓝桥杯][算法提高VIP]凶手-思维
  10. python适用范围_Python应用范围总结概览