Hawk-and-Chicken详解

article/2025/10/12 1:08:57

题目描述:

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.

有n个小朋友在一个班级中,现在要选择班长。收集了小朋友们的意见,一条意见表示为A认为B合适。这个是具备传递性的,A认为B合适,B认为C合适。那么A也会认为C合适。
现在需要提供一份候选人名单,这里面的人,是被最多的人,认为合适的。

输入:

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.
第一个整数,表示测试数据的组数。
每组数据,第一行两个整数n和m
接下来m行,每行两个整数a,b,表示a认为b合适,小朋友的编号为0~n-1

输出:

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.
对于每组数据,先输出Case编号。接下来一个整数表示最多的票数。接下来是满足条件的小朋友编号,从小到大输出。

样例输入:

2
4 3
3 2
2 0
2 13 3
1 0
2 1
0 2

样例输出:

Case 1: 2
0 1
Case 2: 2
0 1 2

写这道题目的时候发现好多人使用tarjan算法
后来想到似乎在书上有一道类似的模板题目,但因为不是很明白结构,所以只能原样套用而不会更改
想了很久总算是想明白了一点,现在先记一下

强连通分量可以通过两次简单的DFS实现,第一次DFS时,选取任意的顶点作为起点,遍历所有尚未访问过的顶点,并在回溯前给顶点编号,对剩余未访问过的顶点,不断重复上述过程
完成编号后,越接近图的尾部(搜索树的叶子),顶点的编号越小,第二次DFS时,先将所有的边反向,然后以标号最大的顶点为起点DFS,之后,只要还有尚未访问过的顶点,就从中选取标号最大的顶点不断重复上述过程
(在第二次DFS时,相当于tarjan算法中栈内不断弹出的过程,每一个被访问的顶点,都是一个强联通分量的根节点)
举个例子:
在这里插入图片描述
在这个图里我们以1位根节点(当然,你也可以换,不要忘了顺序就好,为了方便,通常以编号最小的那个开始),在第一次dfs中:
1---------->2
2---------->3
位置3:
发现没有没有可以继续往下走了,3没有指向的地方,于是回到2
位置2:
2也没有没有被访问过的点了,回到1
位置1:
1也没有了,第一次的dfs到此结束
在访问时,我们标记一下点,从内到外依次是:
3 ------- 2 ---------1
第二次dfs 我们反向建图,并按照标记的点反向寻找
在这里插入图片描述
原先标记是3–2—1
反向寻找,也就是1–2----3
位置1:
没有指向的点,下一个
位置2:
指向1,但是1已经被访问过了,下一个
位置3:
指向的数字都被访问完了,第二次dfs结束
然后你就会有一种疑惑,所以这两次dfs到底干嘛的???
当然是,缩点啊
刚刚的例子只是热身,方便理解,换一个样例看看

在这里插入图片描述
第二个样例:
第一次dfs
顺序是0-------->>>>2-------------->>>>1
按照访问的顺序从内而外是
1--------2--------0
在这里插入图片描述
第二次dfs 反向建图
按照上述的顺序反向寻找
第一个数字:0
0------->>1----------->>2
发现用第一个数字就可以将整个成环状的图都过了一遍
就可以将他们缩成一个点
在这里插入图片描述
复杂一点的图就像这样
在这里插入图片描述
这样就建图完成啦,随后就可以根据题目要求书写啦~~
本题代码如下(这道题因为时间允许使用的是vector连接,可以换成邻接表)

code:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<stack>
using namespace std;
int v,m;
int cnt=0;
const int maxn=5050;
const int maxm=30010;
vector<int> g[maxn];//正向建图的连接
vector<int> rg[maxn];//反向建图的连接
vector<int> vs;//标记第一次dfs时从内往外的数字
vector<int> jiang[maxn];//缩点之后的反向连接
bool used[maxn];
int in[maxn];//判断是否这个点有指向的点
int much[maxn];//缩点之后该点代表的数字个数
int sum[maxn];//那块联通分量的点的个数
int cmp[maxn];//缩点之后该点的表示
int visit[maxn];//缩点之后检验是否被访问
int a[maxm];
int b[maxm];
void add_edge(int from,int to)
{g[from].push_back(to);rg[to].push_back(from);
}//正向与反向建图
void dfs(int v)
{used[v]=true;for(int i=0;i<g[v].size();i++){if(!used[g[v][i]])dfs(g[v][i]);}vs.push_back(v);
}//第一遍dfs
int findd(int what)
{visit[what]=1;int temp=much[what];for(int i=0;i<jiang[what].size();i++){if(visit[jiang[what][i]]==0)temp+=findd(jiang[what][i]);}return temp;
}//缩点之后反向寻找到底有多少人觉得他适合
void rdfs(int v,int k)
{used[v]=true;cmp[v]=k;much[k]++;for(int i=0;i<rg[v].size();i++){if(!used[rg[v][i]]){rdfs(rg[v][i],k);}}
}//反向寻找
void scc(int ca)
{memset(used,0,sizeof(used));vs.clear();for(int i=0;i<v;i++){if(!used[i])dfs(i);}memset(used,0,sizeof(used));memset(much,0,sizeof(much));int k=1;for(int i=vs.size()-1;i>=0;i--){if(!used[vs[i]])rdfs(vs[i],k++);}//到这一步缩点完成,cmp[i]代表缩点之后他的新名字memset(in,0,sizeof(in));memset(sum,0,sizeof(sum));for(int i=0;i<m;i++){jiang[cmp[b[i]]].push_back(cmp[a[i]]);if(cmp[b[i]]!=cmp[a[i]])in[cmp[a[i]]]++;}//判断是否出度为0int maxx=-1;for(int i=1;i<k;i++){if(in[i]==0){memset(visit,0,sizeof(visit));sum[i]+=findd(i);maxx=max(maxx,sum[i]);}}//寻找到底有多少人觉得他合适(包括他自己,后来减掉就好了)printf("Case %d: %d\n",ca,maxx-1);int flag=0;for(int i=0;i<v;i++){if(sum[cmp[i]]==maxx){if(flag==0){printf("%d",i);flag=1;}elseprintf(" %d",i);}}printf("\n");
}
int main()
{int ttt;scanf("%d",&ttt);for(int i=1;i<=ttt;i++){scanf("%d%d",&v,&m);for(int i=0;i<=v;i++){g[i].clear();rg[i].clear();jiang[i].clear();}for(int i=0;i<m;i++){scanf("%d%d",&a[i],&b[i]);add_edge(a[i],b[i]);}scc(i);}return 0;
}

http://chatgpt.dhexx.cn/article/6fF24ScU.shtml

相关文章

Webhook介绍和应用

Webhook概念 Webhook本质上也是API&#xff0c;只不过是反向调用。 Webhook 产生背景 正常调用API是由应用去调用对方服务器的API&#xff0c;为了实现最大程度利用好资源以及并发&#xff0c;通常这个API可能是异步调用&#xff0c;这样&#xff0c;在调用的过程中&#xf…

【论文笔记】—毫米波雷达穿雾式高分辨率成像—Supervised—HawkEye系统—2020-CVPR

题目&#xff1a;Through Fog High-Resolution Imaging Using Millimeter Wave Radar 利用毫米波雷达进行穿雾式高分辨率成像 DOI&#xff1a;10.1109/CVPR42600.2020.01148时间&#xff1a;2020会议&#xff1a;2020-CVPR机构&#xff1a;伊利诺伊大学厄巴纳-香槟分校 论文…

Hi3518ev200:byun hawkeye刷机与配网

背景&#xff1a;从浩峰大佬那拿的boyun hawkeye互联网摄像机&#xff0c;听说是从闲鱼上淘的&#xff0c;被淘汰的产品&#xff1b;买来用来二次开发。 1&#xff09;拆开外面的外壳&#xff0c;然后将串口线引出&#xff0c;接usb转ttl&#xff0c;usb供电&#xff0c;用xsh…

Hawkeye: Towards a Desired Directed Grey-box Fuzzer 论文阅读笔记

中文译名&#xff1a;hawkeye: 需求导向的灰盒模糊测试 作者&#xff1a;Hongxu Chen 单位&#xff1a;南洋理工大学 国家&#xff1a; #新加坡 年份&#xff1a; #2018年 来源&#xff1a; #ccs 关键字&#xff1a; #定向fuzzing #fuzzing #灰盒 代码地址&#xff1a; https:/…

璞华大数据HawkEye设备数字化管理之远程协助功能

应用背景 对于设备制造厂商或者设备使用企业而言&#xff0c;在日常的设备维修管理过程中&#xff0c;多长时间到达现场和多长时间排除故障&#xff0c;是考核工厂维修工和售后维修人员工作绩效的重要指标。 在设备专业程度和精密度不断提高以及国内外新冠疫情的影响下&#x…

论文阅读_Hawkeye: Towards a Desired Directed Grey-box Fuzzer

作者: Hongxu Chen, Yinxing Xue&#xff0c; Yuekang Li, Bihuan Chen, Xiaofei Xie, Xiuheng Wu, Yang Liu 出处&#xff1a;CCS 2018 背景 定向模糊测试就是引导模糊测试朝着目标代码块的方向探索&#xff0c;让已覆盖的代码块越来越接近目标代码块&#xff0c;最终测试目标…

新产品发布 | HawkEye作业票管理系统

作业票是电力、石化、工程现场等行业的重要管理制度之一&#xff0c;但是长期以来一直是手工、纸质的方式申请和签发。这种方式耗时&#xff0c;出错率高&#xff0c;数据记录和统计不完整&#xff0c;是一种效率很低的管理方法。 2021年&#xff0c;国家应急管理部办公厅印发…

HawkEye产品深受市场认可,与多家行业龙头企业达成合作,共同开拓行业市场

2023年6月&#xff0c;日立&#xff08;中国&#xff09;有限公司与璞华大数据正式签订合作协议&#xff0c;双方将在产品和技术领域进行深度合作&#xff0c;共同开拓国内智能制造市场。 这是继方正国际、浪潮等行业龙头企业之后&#xff0c;又一家选择与璞华大数据HawkEye产…

HawkEye-20G:20 Gbps Arria-10 FPGA加速卡

HawkEye-20G:20 Gbps Arria-10 FPGA加速卡 HawkEye是基于Intel Arria 10 FPGA的薄型PCIe加速卡。该平台拥有高达18 GB的DDR4板载内存,2条SFP +链接,最高速度为28 Gb / s,以及一个PCIe x8 Gen 3主机接口。 Arria 10 FPGA可提供多达480K LE和IEEE浮点功能。 HawkEye的内存方…

基于PyTorch、易上手,细粒度图像识别深度学习工具库Hawkeye开源

转载自丨机器之心 鉴于当前领域内尚缺乏该方面的深度学习开源工具库&#xff0c;南京理工大学魏秀参教授团队用时近一年时间&#xff0c;开发、打磨、完成了 Hawkeye——细粒度图像识别深度学习开源工具库&#xff0c;供相关领域研究人员和工程师参考使用。本文是对 Hawkeye 的…

高德地图marker自定义图标只显示一半

直接从高德那里搬过来代码&#xff0c;这里的偏移量是因为偏移量有问题&#xff0c;所以出现了图片只显示一半的情况。 加上imageOffset即可解决

原 matplotlib散点scatter学习2,参数测试(marker1)

续上篇 绘制散点图的函数&#xff0c;x&#xff0c;y分别对应点的x轴坐标和y轴坐标 plt.scatter(x,y) matplotlib.pyplot.scatter(x, y, sNone, cNone, markerNone, cmapNone, normNone, vminNone, vmaxNone, alphaNone, linewidthsNone, vertsNone, edgecolorsNone, , dataNon…

python画图(标记、marker、设置标记大小、marker符号大全)

初衷 本人由于平常写论文需要输出一些结果图&#xff0c;但是苦于在网上搜python画图时&#xff0c;详细的教程非常多&#xff0c;但是就是找不到能马上解决自己问题那一行代码&#xff0c;所以打算写一些适合需求简单的朋友应急用的教程&#xff0c;应急就必须方便搜索&#x…

matplotlib画布中属性设置常用函数及其说明

绘图时设置坐标轴属性 data np.arange(0,1,0.01) plt.title(my lines example) plt.xlabel(x) plt.ylabel(y) plt.xlim(0,1) plt.ylim(0,1) plt.xticks([0,0.2,0.4,0.6,0.8,1]) plt.yticks([0,0.2,0.4,0.6,0.8,1]) plt.tick_params(labelsize 12) plt.plot(data,data**2) pl…

MATLAB里面size什么意思,matlab中的makersize是什么意思

MATLAB中的绘图语言 plot(j,len1-i,ro,MarkerS...参数那么多&#xff0c;有点晕啊&#xff0c;每个参数代表什么意思啊&#xff1f;&#xff1f;&#xff1f; 前面的j和len1-i...plot(...,PropertyName,PropertyValue,...) plot(j,len1-i,ro,MarkerSize,10,LineWidth,2); 其中j…

matplotlib画图自定义marker

文章目录 matplotlib画图自定义markermarker的特点通过插入图片实现自定义marker通过Path实现自定义marker matplotlib画图自定义marker 在matplotlib工具箱中可以画marker的高级作图函数一共有两个&#xff0c;分别为plot和scatter&#xff0c;可以画出多种marker。但如果需要…

plot函数的应用

这一部分是关于plot函数的简单应用&#xff0c;下面附有一段代码示例&#xff0c;详情请见代码及其注释。 import matplotlib as mlp from PIL import Image from pylab import * import os image_path "D:/warehouse/image_list" # 储存照片的路径 os.chdir(imag…

pyplot散点图标记大小

本文翻译自&#xff1a;pyplot scatter plot marker size In the pyplot document for scatter plot: 在散点图的pyplot文档中&#xff1a; matplotlib.pyplot.scatter(x, y, s20, cb, markero, cmapNone, normNone,vminNone, vmaxNone, alphaNone, linewidthsNone,facetedTr…

matplotlib:marker类型/size/空心

marker类型 plt.plot(RSEP_data, colorcolor[1], labelRSEP, linestyle--, markerv, markerfacecolornone, markersize10)

python pyplot 宽高等比_如何使pyplot分散中的markersize不依赖于图形的比例?

我在做一个模拟&#xff0c;我想用pyplot来显示。在模拟中&#xff0c;有一些圆在移动&#xff0c;当它们重叠时会发生一些事情。当我尝试用pyplot显示这个时&#xff0c;标记的大小不正确。在 我试过改变标记的大小&#xff0c;但没有解决问题。经过一些测试&#xff0c;我意识…