http://www.lydsy.com/JudgeOnline/problem.php?id=1051

Description

  每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这
种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头
牛被所有的牛认为是受欢迎的。

Input

  第一行两个数N,M。 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可
能出现多个A,B)

Output

  一个数,即有多少头牛被所有的牛认为是受欢迎的。

思路:求原图的强连通分量,缩点重构图,如果新DAG中仅存在1个出度为0的点,那么答案就是该强连通分量的包含的节点数,如果不存在这样的点或存在多个(存在多个说明不会有牛被所有牛欢迎),那么无解,输出0

 #include<iostream>
 #include<cstring>
 #include<cstdio>
 #include<vector>
 using namespace std;
 ;
 vector<int> G[maxn],G2[maxn],S;
 int n,m,vis[maxn],book[maxn],bcc_nodes[maxn],bcc_count,out_edges[maxn];
 void init(){
     memset(vis,,sizeof(vis));
     memset(book,,sizeof(book));
     memset(bcc_nodes,,sizeof(bcc_nodes));
     memset(out_edges,,sizeof(out_edges));
     bcc_count=;
 }
 void dfs(int u){
     vis[u]=;
     ;i<G[u].size();i++){
         int go=G[u][i];
         if(!vis[go]) dfs(go);
     }
     S.push_back(u);
 }
 void dfs2(int u){
     book[u]=bcc_count;bcc_nodes[bcc_count]++;
     ;i<G2[u].size();i++){
         int go=G2[u][i];
         if(!book[go]) dfs2(go);
     }
 }
 int main()
 {
     scanf("%d %d",&n,&m);
     init();
     ;i<=m;i++){
         int a,b;scanf("%d %d",&a,&b);
         G[a].push_back(b);
         G2[b].push_back(a);
     }
     ;i<=n;i++) if(!vis[i]) dfs(i);
     ;i>=;i--) if(!book[S[i]]){
         ++bcc_count;dfs2(S[i]);
     }
     ,ans=;
     ;i<=n;i++) ;j<G[i].size();j++) if(book[i]!=book[G[i][j]]){
         out_edges[book[i]]=;break;
     }
     ;i<=bcc_count;i++) if(!out_edges[i]) k++,ans+=bcc_nodes[i];
     ) printf("%d",ans);
     ");
     ;
 }

BZOJ1051 受欢迎的牛的更多相关文章

  1. BZOJ1051:受欢迎的牛(并查集 / Tarjan)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8161  Solved: 4460 Description ...

  2. p2341&bzoj1051 受欢迎的牛

    传送门(洛谷) 传送门(bzoj) 题目 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C ...

  3. bzoj1051受欢迎的牛(Tarjan)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4776  Solved: 2542 Description ...

  4. 【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan缩点判出度算点数

    [bzoj1051] [HAOI2006]受欢迎的牛 2014年1月8日7450 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B ...

  5. 【BZOJ1051】[HAOI2006]受欢迎的牛

    [BZOJ1051][HAOI2006]受欢迎的牛 题面 bzoj 洛谷 题解 假如\(A\)喜欢\(B\)就连一条\(A\)到\(B\)的边 然后缩点,如果图不连通就\(Impossible\) 否 ...

  6. bzoj1051 [HAOI2006]受欢迎的牛

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4773  Solved: 2541[Submit][Sta ...

  7. 【BZOJ1051】1051: [HAOI2006]受欢迎的牛 tarjan求强连通分量+缩点

    Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认 ...

  8. [bzoj1051] [HAOI2006]受欢迎的牛 (Tarjan+缩点)

    强连通图,缩点 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受 ...

  9. 【HAOI2006】【BZOJ1051】【p1233】最受欢迎的牛

    BZOJ难得的水题(其实是HA太弱了) 原题: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B ...

随机推荐

  1. 【solr】solr5.0整合中文分词器

    1.solr自带的分词器远远满足不了中文分词的需求,经查使用最多的分词器是solr是mmseg4j分词器,具体整合大家可以参考 https://github.com/zhuomingliang/mms ...

  2. 冒泡算法C#

    冒泡算法C# namespace数组排序 { classProgram { staticvoidMain(string[]args) { inttemp=; ,,,,,,,,}; #region该段与 ...

  3. Highcharts 功能强大、开源、美观、图表丰富、兼容绝大多数浏览器的纯js图表库

    http://www.hcharts.cn/index.php 暂无介绍,等待后续补充

  4. 获取URL参数

    function GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)( ...

  5. C# 通过委托控制进度条以及多线程更新控件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. linux命令(7)killall

    killall命令: Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name).我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀 ...

  7. REST架构实质(转)

    REST(Representational State Transfer) 曾经被误解为只是CRUD(增删改查),从这个层面上,好像REST只是和RPC一个层面的东西,没有什么了不起,其实这些都是对R ...

  8. 两个Python web框架:Django & Tornado比较

    就是说它作为 web 框架比 Django 简单,又支援异步 IO,且更不需要前端的 webserver ? 我已经混乱了, Tornado是 Nginx.Django.Node.js 的结合体?又或 ...

  9. log4net日志信息 插入 mysql数据库?

    log4net配置文件如下: <!--插入数据库--> <appender name="AdoNetAppender_MySql" type="log4 ...

  10. win10安装软件被阻止后

    以管理员身份运行CMD,然后在cmd里执行就可以了.