强连通 反向建图 hdu3639
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
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.
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.
Then follow a line contain all the Hawks' number. The numbers must be listed in increasing order and separated by single spaces.
#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的更多相关文章
- HDU 3639 Hawk-and-Chicken(强连通缩点+反向建图)
http://acm.hdu.edu.cn/showproblem.php?pid=3639 题意: 有一群孩子正在玩老鹰抓小鸡,由于想当老鹰的人不少,孩子们通过投票的方式产生,但是投票有这么一条规则 ...
- HPU 3639--Hawk-and-Chicken【SCC缩点反向建图 && 求传递的最大值】
Hawk-and-Chicken Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)
题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给 ...
- HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)
逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...
- POJ3687——Labeling Balls(反向建图+拓扑排序)
Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...
- POJ-1122 FDNY to the Rescue!---Dijkstra+反向建图
题目链接: https://vjudge.net/problem/POJ-1122 题目大意: 给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路 ...
- HDU 2647 Reward 【拓扑排序反向建图+队列】
题目 Reward Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to d ...
- HUD2647 Reward_反向建图拓扑排序
HDU2647 Reward 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意:老板要发奖金了,有n个人,给你m对数,类似a b,这样的一对 ...
- POJ 3268——Silver Cow Party——————【最短路、Dijkstra、反向建图】
Silver Cow Party Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Su ...
随机推荐
- java中Runnable和Callable的区别
文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...
- mac OS 安装淘宝npm镜像
淘宝npm镜像官网 https://npm.taobao.org/ 在终端输入 npm install -g cnpm --registry=https://registry.npm.taobao.o ...
- Eclipse Mac OS 安装中文简体语言包
打开Eclipse软件,在导航Eclipse下拉菜单中点开 About Eclipse 查看版本 我的是 Eclipse IDE for Enterprise Java Developers. Ver ...
- C语言编程入门题目--No.15
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示, 60分以下的用C表示. 1.程序分析:(a>b)?a:b这是条件运算符的基本例子. 2 ...
- 数据结构--顺序栈--C++实现
#include <iostream> #define MaxSize 5000 using namespace std; template <typename T> clas ...
- 图论-网络流-Dinic (邻接表版)
//RQ的板子真的很好用 #include<cstdio> #include<cstring> #include<queue> #define INF 1e9 us ...
- HTML(表单标签)
<form> 标签 用于为用户输入创建 HTML 表单 表单能够包含 input 元素,比如:文本字段.复选框.单选框.提交按钮等等 表单用于向服务器传输数据 action 属性:规定当提 ...
- css属性、样式、边框、选择器
CSS 层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种 样式表 语言, 用来描述 HTML或 XML(包括如 SVG.MathML.XHTML 之类的 XML 分 ...
- 安装KubeSphere
1. KubeSphere 是什么 1.1. 官方解释 KubeSphere是一个分布式操作系统,提供以Kubernetes为核心的云原生堆栈,旨在成为第三方应用程序的即插即用架构,以促进其生态系统的 ...
- golang之array
golang使用array表示固定大小的数组,使用slice表示动态数组. package main import "fmt" func main() { var a = [5]i ...