班长竞选 || Kosaraju算法

选班长问题(投票选班长) 选班长:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 选班长{ enum houxuan { 小王, 小黄, 小刘, 小林, 小丁 } class Program { st... 阅读详情

题意
大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗?

Input
本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= n <= 5000, 0 <m <= 30000),接下来有 M 行包含两个整数 A 和 B(A != B) 表示 A 认为 B 合适。

output
对于每组数据,第一行输出 “Case x: ”,x 表示数据的编号,从1开始,紧跟着是最高的票数。 接下来一行输出得票最多的同学的编号,用空格隔开,不忽略行末空格!

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

解题思路
在这里插入图片描述

我们可以知道,1投票给2,2投票给3,那么3得到了2票。
所以一个连通分量里面的所有点的票数都是相同的。

所以我们可以把连通分量压缩成点,然后可以知道 : 最大票数的点肯定在出度为0的点上,如果我们把压点后的图给求个反图,那么就是入度为0的点里存在最大的票。

强连通分量(scc)

利用Kosaraju算法求scc

压点后求反图,然后计算最大票数

Kosaraju算法: DFS1次求逆后序序列,根据逆后序序列DFS遍历染色SCC。

代码实现

#include<iostream>
#include<vector>
#include<algorithm>
#define nmax 5005
#include<cstdio>
using namespace std;
vector<int> G1[nmax], G2[nmax], G3[nmax];  //G1--原图  G2--反图  G3--scc的反图
int N, M, A, B;
bool vis[nmax];
int scc_size;   //SCC的个数
int c[nmax];   //该点属于哪个scc
int reder;       //染色scc
int dfn[nmax];   //记录序列
int dfni;        //索引
int sum[nmax];   //入度为0 的scc的票数
int degree[nmax]; //入度
bool G3vis[nmax][nmax];  //G3存反图时避免重复存入   /   标记
struct scc { vector<int> ppp; };  //缩点
scc Scc[nmax];

void add(int u, int v, int g)  //g=1时加G1,g==2时加G2 ,g==3时加G3
{
	if (u == v)  return;
	if (g == 1)
		G1[u].push_back(v);
	if (g == 2)
		G2[u].push_back(v);
	if (g == 3)
		G3[u].push_back(v);
}

void dfs1(int x)    //求后序列
{
	vis[x] = 1;
	for (int i = 0; i < G1[x].size(); i++)
		if (vis[G1[x][i]] == 0) dfs1(G1[x][i]);
	dfn[dfni++] = x;
}

void dfs2(int x)   //遍历逆后序列
{
	c[x] = reder;
	for (int i = 0; i < G2[x].size(); i++)
		if (c[G2[x][i]] == 0)  dfs2(G2[x][i]);
}

void buildG()    //构造图
{
	for (int i = 1; i <= M; i++)
	{

		scanf("%d %d",&A,&B);
		add(A, B, 1);
		add(B, A, 2);
	}
}

void ini()  //初始化
{
	for (int i = 0; i < nmax; i++)
	{
		G1[i].clear();
		G2[i].clear();
		dfn[i] = 0;
		c[i] = 0;
		vis[i] = 0;
		for (int j = 0; j <nmax; j++)
			G3vis[i][j] = 0;
	}
	for (int i = 0; i <= scc_size; i++) 
	{G3[i].clear();
	sum[i] = 0;
	Scc[i].ppp.clear();
	degree[i]=0;
	}
	dfni = 0;
	reder = 0;
	scc_size=0;
}

void kosaraju()
{
	//求后序列
	for (int i = 0; i < N; i++)
	{
		if (vis[i] == 0)  dfs1(i);
	}
	//dfs 逆后序 ,得到scc
	for (int i = N-1; i >= 0; i--)
		if (c[dfn[i]] == 0) ++reder, dfs2(dfn[i]);  //reder染色SCC
}

void suodian_and_G3()   //缩点和创建G3
{
	for (int i = 0; i < N; i++)
	{
		Scc[c[i]].ppp.push_back(i);
		for (int j = 0; j < G1[i].size(); j++)
		{
			if (c[i] != c[G1[i][j]])  //注意这里是scc的反图
			{
				if (G3vis[G1[i][j]][i] == 0)  //判断有没有加入过
				{
					add(c[G1[i][j]],c[i], 3);
					degree[c[i]]++;   //scc的反图入度更新
					G3vis[G1[i][j]][i]++;
				}
			}
		}
	}
}

//SCC求反图是为了这里好求票数
int dfs3(int x)  //求第i个SCC的票数
{
	vis[x] = 1;
	int ans = Scc[x].ppp.size();
	for (int i = 0; i < G3[x].size(); i++)
	{
		if (vis[G3[x][i]] == 0) ans+=dfs3(G3[x][i]);
	}
	return ans;
}

int main()
{
	ios::sync_with_stdio(0);
	int count = 0;
	int T;

	scanf("%d",&T);
	for( int Ti=0;Ti<T;Ti++)
	{

		scanf("%d %d",&N,&M);
		count++;
		buildG();
		kosaraju();
		suodian_and_G3();
		scc_size = reder;
		for (int i = 1; i <= scc_size; i++) //求每个SCC的票数
		{
			if (degree[i] == 0) {
				for (int k = 0; k <= scc_size; k++)
					vis[k] = 0;
				sum[i] = dfs3(i)-1;
			}
		}
		int smax = 0;
		for (int i = 1; i <= scc_size; i++) //找出最大的
		{
			smax = max(sum[i], smax);
		}

		int res[nmax]; //答案
		int resi = 0;
		for (int i = 1; i <= scc_size; i++)
		{
			if (sum[i] == smax)  //找到最大的SCC
			{
				for (int j = 0; j < Scc[i].ppp.size(); j++)
				{
					res[resi++] = Scc[i].ppp[j];
				}
			}
		}

		sort(res, res + resi);

		printf("Case %d: %d\n",count,smax);

		printf("%d",res[0]);
		for (int i = 1; i < resi; i++)
		{

			printf(" %d",res[i]);
		}

		printf("\n");
		ini();
	}

	return 0;
}

小结
Kosaraju算法是一个很精妙的算法,2遍dfs可以求出不同颜色的SCC,然后把SCC压点,取压点后的图的反图,便于dfs3求得sum,然后把最大的压点SCC,提取出来他的点,排序后输出。

程序设计Week8——C-班长竞选 C-班长竞选题目描述InputOutput解题思路实现代码总结 题目描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适,现收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学。 Input 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两... 阅读详情

相关推荐

WEEK8-C-班长竞选

大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? Input 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= n &lt...

m0_46388072的博客 269

C - 班长竞选(Kosaraju算法

题意: input: 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= n <= 5000, 0 <m <= 30000),接下来有 M 行包含两个整数 A 和 B(A != B) 表示 A 认为 B 合适。 output: 对于每组数据,第一行输出 “Case x: ”,x 表示数据的编号,从1开始,紧跟着是最高的票数。 接下来一...

banzixiang的博客 1015

制作 img系统镜像的详细方法

      I.MX6开发板目前支持从TF卡和eMMC启动,启动时,由于各个不同的启动文件对路径有不同的要求,例如uboot文件要求位于启动设备的某个块,dtb文件要求在FAT分区上,文件系统要求在Linux分区上,基于此,我们目前采用将映像制作成img文件的方式,这样可以更简单完成对启动卡的制作。 关于如何制作img,方法如下:方法一  Windows下面利用Win32工具1.   准备我司提供...

armkits的博客 4万+

班长竞选(kosaraju缩点)

问题描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? Input 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= ...

龙征天的博客 435

别再只看pLDDT了!AlphaFold预测结果解读保姆级指南:pLDDT、PAE、pTM、ipTM到底怎么看?

本文详细解析了AlphaFold预测结果中的关键指标pLDDT、PAE、pTM和ipTM,帮助用户从单一依赖pLDDT进阶到全面理解蛋白质结构预测。通过实际案例和技巧,指导如何正确解读这些指标,避免常见错误,并提供了从预测到发表的实用建议。

weixin_29100399的博客 356

OS实验xv6 6.S081 开坑

OS实验xv6 6.S081 开坑 终于把xv6 2019 6.S081做完了,网络部分没有写,因为有计网实验了。怎么说呢,xv6的坑有点多,能做完多亏了:和我同学ljj交流,参考RedemptionC老哥的博客(他写的非常详细,遗憾的是,他好像没有写mmap),再者就是参考这位老哥的做法(没有源码,写得不是特别详细,不过有借鉴作用,mmap就是借鉴了他的思想)……废话不多说了,直接开始。 实验指导 首推RedemptionC的博客 这位老哥的个人博客 xv6 6.S081官网(后面的实验都要参考官网

不定期更新系统使用、编程小技巧,哔哩哔哩账号:https://space.bilibili.com/399455629,欢迎关注 4493

Kosaraju算法求SCC 竞选班长

题意: 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? Input 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= n...

FoxMakarov的博客 380

【数据库】SQL Server 2008 R2 安装全流程详解与常见问题避坑指南

本文详细解析了SQL Server 2008 R2的完整安装流程与核心配置。从安装前的系统兼容性检查、.NET Framework依赖准备,到图文详解实例配置、混合身份验证模式设置等关键步骤,并提供了安装失败、服务无法启动等高频问题的排查与避坑指南,帮助用户顺利完成部署。

java5的博客 1242

分布式选举算法-霸道算法/欺负算法(bully algorithm)

分布式 选举 算法 霸道算法 欺负算法 bully algorithm

fofcn的专栏 2050

EWF写保护功能详解:从安装到实战操作指南

本文详细介绍了EWF写保护功能的安装与实战操作指南。EWF(Enhanced Write Filter)通过重定向写入操作保护硬盘分区,特别适合需要长期稳定运行的系统场景。文章涵盖从安装准备、图形界面操作到命令行高级管理的全流程,并提供了常见问题的解决方案,帮助用户轻松掌握这一实用工具。

weixin_28710999的博客 448

从 Claude Code 到 SAP ADT,vibing-steampunk 把 ABAP 开发带进 Agentic 工程现场

vibing-steampunk(vsp)是一个连接SAP ADT API与AI编码代理的桥梁工具,通过MCP协议实现ABAP开发的自动化。它绕开传统GUI脚本方式,直接利用ADT REST API进行代码读写、调试和部署。该工具提供包分析、边界检查、LUW分析等功能,并创新性地采用Hyperfocused模式和方法级编辑来优化token使用效率。通过上下文压缩技术,vsp能智能提取关键代码片段,显著提升AI处理ABAP代码的精准度,为SAP系统现代化改造提供了高效的技术路径。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 191

Kosaraju算法、强连通图(例C-班长竞选

既然PPT有现成的,我就不特意再写一个Kosaraju算法解释了。一会把课堂上的PPT扒上来做笔记。 目录强连通图DFS序Kosaraju算法例:班长竞选 强连通图 什么是强连通图? 强连通图(Strongly Connected Graph)是指在有向图G中,如果对于每 一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有 向图中的极大强连通子图称做有向图的强...

ニャンコちゃん的博客 385

北斗导航 | ChatGPT之RTK、RTD、ARAIM算法原理及程序代码(ChatGPT看你怎么回答,附部分代码)

ChatGPT之RTK、RTD、ARAIM算法原理及程序代码

尘世冰封的专栏 3679

C-班长竞选

C-班长竞选 一、题目描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适, 意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数, 并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? Input 本题有多组数据。第一行 T 表示数据组数。 每组数据开始有两个整数 N...

东玮的博客 1074

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

week8_C 班长竞选(Kosaraju算法 SCC缩点)

题目描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? 输入输出 Input 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 &...

EllaSmith的博客 591

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WEEK8 周记 作业——kosaraju模拟&DFS序_班长竞选

WEEK8 周记 作业——kosaraju模拟&DFS序_班长竞选 一、题意 1.简述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? 2.输入格式 本题有多...

wcxiaobaiaa的博客 643

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Kosaraju模板题——班长竞选

问题描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? 【输入】 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= n...

weixin_43517157的博客 287

kosaraju---班长竞选

文章目录题意输入输出思路总结代码 题意 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? 输入 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和...

qq_45757204的博客 214

班长竞选

问题描述: 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? input: 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 &lt...

zhL816的博客 516

班长竞选【强连通分量】【Kosaraju算法】【缩点】【dfs】

问题描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? Input 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= ...

YingMila的博客 262

week8作业题_C - 班长竞选

C - 班长竞选 题目描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? Input 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N ...

Programmer_Fang的博客 495

week8作业C 班长竞选 kosaraju

题目: 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? 输入: 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= n &...

qq_45639151的博客 299

WEEK8 作业 C - 班长竞选

C - 班长竞选 题目描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗?### Input 输入有若干组,每组中的第一行为二个数N(1<=N<=500)...

weixin_44484035的博客 187

Week 8——班长竞选

班长竞选 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? Input 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <=...

weixin_44203022的博客 188

程序设计思维 C - 班长竞选 (强连通分量、kosaraju算法)

题目 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗? Input 本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= n <= 5000, 0 <m <= 30000),接下来有 M 行包含两个整数 A 和 B

weixin_43826681的博客 261
上一篇: 猫猫向前冲 || 拓扑排序
下一篇: CSP201604-3 路径解析
Hhhhhhhhh毅
博客等级 码龄7年 7粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值