Hawk-and-Chicken

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3321    Accepted Submission(s): 1041

Problem Description
Kids in kindergarten enjoy playing a game called Hawk-and-Chicken. But there always exists a big problem: every kid in this game want to play the role of Hawk.
So the teacher came up with an idea: Vote. Every child have some nice handkerchiefs, and if he/she think someone is suitable for the role of Hawk, he/she gives a handkerchief to this kid, which means this kid who is given the handkerchief win the support. Note the support can be transmitted. Kids who get the most supports win in the vote and able to play the role of Hawk.(A note:if A can win
support from B(A != B) A can win only one support from B in any case the number of the supports transmitted from B to A are many. And A can't win the support from himself in any case.
If two or more kids own the same number of support from others, we treat all of them as winner.
Here's a sample: 3 kids A, B and C, A gives a handkerchief to B, B gives a handkerchief to C, so C wins 2 supports and he is choosen to be the Hawk.
 
Input
There are several test cases. First is a integer T(T <= 50), means the number of test cases.
Each test case start with two integer n, m in a line (2 <= n <= 5000, 0 <m <= 30000). n means there are n children(numbered from 0 to n - 1). Each of the following m lines contains two integers A and B(A != B) denoting that the child numbered A give a handkerchief to B.
 
Output
For each test case, the output should first contain one line with "Case x:", here x means the case number start from 1. Followed by one number which is the total supports the winner(s) get.
Then follow a line contain all the Hawks' number. The numbers must be listed in increasing order and separated by single spaces.
 
Sample Input
2
4 3
3 2
2 0
2 1
 
3 3
1 0
2 1
0 2
 
Sample Output
Case 1:2
0 1
Case 2: 2
0 1 2
 
反向建图的原因是方便统计,倘若是正向的话 ,那么如果有2->3,3->1,2->1  2这个节点在计算的时候很难搞
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
const int M=;
int head[N],tot,scnt,cnt,cont,sz[N];
int dfn[N],low[N],bl[N],q[N],l;
bool instack[N],ru[N];
vector<int>G;
vector<int>C[N];
struct node{
   int to,next;
}e[M];
void add(int u,int v){
   e[tot].to=v;
   e[tot].next=head[u];
   head[u]=tot++;
}
void init(){
   tot=scnt=cnt=l=;
   memset(head,-,sizeof(head));
   memset(dfn,,sizeof(dfn));
   memset(instack,,sizeof(instack));
   memset(ru,,sizeof(ru));
   G.clear();
   for(int i=;i<N;++i) C[i].clear();
}
void Tajan(int u){
   dfn[u]=low[u]=++cnt;
   q[l++]=u;
   instack[u]=;
   for(int i=head[u];i+;i=e[i].next){
    int v=e[i].to;
    if(!dfn[v]) {
        Tajan(v);
        low[u]=min(low[u],low[v]);
    }
    else if(instack[v]&&dfn[v]<low[u])
        low[u]=dfn[v];
   }
   if(dfn[u]==low[u]) {
    ++scnt;
    int t;
    sz[scnt]=;
    do{
        t=q[--l];
        bl[t]=scnt;
        ++sz[scnt];
        C[scnt].push_back(t);
        instack[t]=;
    }while(t!=u);
   }
}
bool used[N];
void dfs(int u,int tz){
   for(int i=head[u];i+;i=e[i].next)
   if(!used[e[i].to]){
    used[e[i].to]=;
    sz[tz]+=sz[e[i].to];
    dfs(e[i].to,tz);
   }
}
struct point{
   int u,v;
}ee[M];
int main(){
    int n,m,u,v,T;
    scanf("%d",&T);
    for(int tas=;tas<=T;++tas){
        init();
        scanf("%d%d",&n,&m);
        for(int i=;i<=m;++i){
            scanf("%d%d",&u,&v);
            add(v,u);
        }
        for(int i=;i<n;++i) if(!dfn[i]) Tajan(i);
        int pp=;
        for(int i=;i<n;++i)
        for(int j=head[i];j+;j=e[j].next){
            int v=e[j].to;
            if(bl[i]==bl[v]) continue;
            else {ee[pp].u=bl[i];ee[pp++].v=bl[v];ru[bl[v]]=;}
        }
        memset(head,-,sizeof(head));
        tot=;
        for(int i=;i<pp;++i) add(ee[i].u,ee[i].v);
        int maxx=-;
        for(int i=;i<=scnt;++i)
        if(!ru[i]){
            memset(used,,sizeof(used));
            dfs(i,i);
            if(maxx<sz[i]) {maxx=sz[i];G.clear(); for(int j=;j<(int)C[i].size();++j) G.push_back(C[i][j]);}
        else if(maxx==sz[i]) for(int j=;j<(int)C[i].size();++j) G.push_back(C[i][j]);
        }
        sort(G.begin(),G.end());
        printf("Case %d: %d\n",tas,maxx-);
        for(int i=;i<(int)G.size()-;++i) printf("%d ",G[i]);
        printf("%d\n",G[(int)G.size()-]);
    }
}

强连通 反向建图 hdu3639的更多相关文章

  1. HDU 3639 Hawk-and-Chicken(强连通缩点+反向建图)

    http://acm.hdu.edu.cn/showproblem.php?pid=3639 题意: 有一群孩子正在玩老鹰抓小鸡,由于想当老鹰的人不少,孩子们通过投票的方式产生,但是投票有这么一条规则 ...

  2. HPU 3639--Hawk-and-Chicken【SCC缩点反向建图 &amp;&amp; 求传递的最大值】

    Hawk-and-Chicken Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)

    题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给 ...

  4. HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)

    逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...

  5. POJ3687——Labeling Balls(反向建图+拓扑排序)

    Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...

  6. POJ-1122 FDNY to the Rescue!---Dijkstra+反向建图

    题目链接: https://vjudge.net/problem/POJ-1122 题目大意: 给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路 ...

  7. HDU 2647 Reward 【拓扑排序反向建图+队列】

    题目 Reward Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to d ...

  8. HUD2647 Reward_反向建图拓扑排序

    HDU2647 Reward 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意:老板要发奖金了,有n个人,给你m对数,类似a b,这样的一对 ...

  9. POJ 3268——Silver Cow Party——————【最短路、Dijkstra、反向建图】

    Silver Cow Party Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Su ...

随机推荐

  1. 基于NFS共享存储实现KVM虚拟机动态迁移

    基于NFS共享存储实现KVM虚拟机动态迁移 一:配置环境 二:安装相关的依赖包 三:实现NFS共享存储 四:KVM机配置相同的步骤 五:安装KVM01安装虚拟机 六:实现迁移  实验初始配置:所有主机 ...

  2. Android MVP 十分钟入门!

    前言 在日常开发APP 的过程中,随着业务的扩展,规模的变化.我们的代码规模也会逐渐变得庞大,每一个类里的代码也会逐渐增多.尤其是Activity和Fragment ,由于Context 的存在,基本 ...

  3. php private学习笔记

    类的权限修饰符,放在属性/方法的前面.用来说明属性/方法的权限特点. 三种权限修饰符 private  私有的 public   公共 protected  保护的 privata 的属性.方法只能在 ...

  4. 控制台报错 [WDS] Disconnected!

    Webpack 的 HMR 功能,是通过 WebSocket 实现的推送 JSON Patch,同时需要第三方库支持. 具体解决方案: 热加载(HMR)是 Webpack Dev Server 最强大 ...

  5. PPT模板素材

    http://588ku.com/sucai/0-dnum-0-54-0-1/

  6. HTML5 Canvas指纹及反追踪介绍

    1 Canvas指纹的简介很多网站通过Canvas指纹来跟踪用户.browserleaks[1]是一个在线检测canvas指纹的网站.一般的指纹实现原理即通过canvas画布绘制一些图形,填写一些文字 ...

  7. 用Eclipse开发项目,你不能不知道的快捷键

    1. 编辑快捷键 编辑快捷键 介绍 psvm + Tab 生成main方法 sout + tab 生成输出语句 Ctrl+X / Ctrl + Y 删除一行 Ctrl+D 复制一行 Ctrl+/ 或 ...

  8. 题解 bzoj 4398福慧双修(二进制分组)

    二进制分组,算个小技巧 bzoj 4398福慧双修 给一张图,同一条边不同方向权值不同,一条边只能走一次,求从1号点出发再回到1号点的最短路 一开始没注意一条边只能走一次这个限制,打了个从一号点相邻节 ...

  9. 网络流中的图像转化为OpenCV中的Mat类型

    1,从网络中读取到的图像流,不支持查找,不能直接转化为Mat类型 2,例子如下: string Url = "http://192.168.0.110/cgi-bin/camera?reso ...

  10. CODING 敏捷实战系列课第二讲:Scrum 敏捷项目管理核心要素之 3355

    Scrum 是敏捷开发流派中最著名和最落地的一支,全球 70% 以上公司的敏捷转型都是以 Scrum 起步.CODING 特邀敏捷顾问.CST & CTC 认证敏捷教练申健老师将在本课程< ...