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

2023-05-16

题目描述

大学班级选班长,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.找到图中所有的SCC(强连通分量)
第一遍dfs确定原图的逆后序序列
第二遍dfs在反图中按照逆后序序列进行遍历
后序:x点遍历完成的次序,即回溯时间
逆后序序列:后序序列的逆序
2.缩点,即将互相可达与单向可达分开考虑
对于当前scc中的点,ans+=scc[i]-1(去除自己)
对于其他scc中的点,是sum即scc[j],其中j可到达i
最后答案在出度为0的SCC中。
3.将边反向,对入度为0的点进行第三遍dfs,计算其能到达点的sum

注意

1.缩点时注意:将u,v加入到c[u],c[v]时保证两个点不在同一个SCC中
2.最后答案一定在出度为0的SCC中

代码

#include<iostream>
#include<cstring>
#include<vector> 
#include<algorithm>
using namespace std;
//n个人中选m个人 
int t,n,m,a,b,c[5005],vis[5005],dfn[5005],dcnt,scnt; 
//c[i]:记录i点所在scc编号 dcnt:dfs序计数 scnt:scc计数
vector<int> g1[5005],g2[5005],g3[5005];//原图,反图,缩点后新图 
int in[5005],scc[5005],sum[5005];
//in[]:记录入度
//scc[]:存放每一个scc中的点 
//sum[]:记录每个scc得到的最大票数
void dfs1(int x)
{
    vis[x]=1;
    for(int i=0;i<g1[x].size();i++)
    {
  	if(!vis[g1[x][i]])
   	    dfs1(g1[x][i]);
    }
    dfn[++dcnt]=x;
}
void dfs2(int x)
{
    c[x]=scnt;
    for(int i=0;i<g2[x].size();i++)
    {
  	if(!c[g2[x][i]])
   	    dfs2(g2[x][i]);
    }
}

void kosaraju()
{
    dcnt=0;
    scnt=0;
    memset(c,0,sizeof(c));
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;i++)
    {//第一遍dfs
  	if(!vis[i]) dfs1(i);
    }
    for(int i=n-1;i>=0;i--)
    {
   	if(!c[dfn[i]])
  	{//第二遍dfs
  	    scnt++;
    	    dfs2(dfn[i]);
  	}
    }
}

void solve()
{//缩点 
    for(int i=0;i<n;i++)
   	scc[c[i]]++; 
    for(int i=0;i<=scnt;i++)
    {
  	in[i]=0; 
  	g3[i].clear();
    }
    for(int i=0;i<n;i++)
    {
   	for(int j=0;j<g1[i].size();j++)
        {
   	    if(c[i]!=c[g1[i][j]])//保证两点不在同一个SCC中
   	    {
    		g3[to].push_back(u);
    		in[u]++;
   	    }
  	}
    }
}
int dfs3(int x)
{//计算入度为0的点的scc[j]
    vis[x]=1;
    //ans+=scc[x];
    int ans=scc[x];
    for(int i=0;i<g3[x].size();i++)
    {
  	if(!vis[g3[x][i]])
   	    ans+=dfs3(g3[x][i]);
    }
    return ans;
}
void init()
{//初始化
    for(int i=0;i<n;i++)
    {
  	g1[i].clear();
  	g2[i].clear();
    }
    memset(in,0,sizeof(in));
    memset(scc,0,sizeof(scc));
    memset(sum,0,sizeof(sum));
}

int main()
{
    scanf("%d",&t);
    for(int it=1;it<=t;it++)
    {
  	scanf("%d %d",&n,&m);
  	init();
  	while(m--)
  	{
   	    scanf("%d %d",&a,&b);
   	    g1[a].push_back(b);
   	    g2[b].push_back(a);
  	}
        kosaraju();//求SCC
        solve();//缩点
  	int cnt=-1;
  	for(int i=1;i<=scnt;i++)
  	{
 	    if(in[i]==0)
   	    {
    		for(int j=1;j<=scnt;j++)
     		    vis[j]=0;//入度为0则清空vis[]
    		sum[i]=dfs3(i);
    		cnt=max(sum[i],cnt);//计算最高票数
   	    }
  	}
    	printf("Case %d: %d\n",it,cnt-1); //注意点数减一
  	int flag=0;
  	for(int i=0;i<n;i++)
  	{
   	    if(sum[c[i]]==cnt)
   	    {
    		if(flag==0)
     		    printf("%d",i);
    		else printf(" %d",i);
    		flag++;
   	     }     
  	}
        printf("\n"); 
     } 
     return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

week8_C 班长竞选(Kosaraju算法 SCC缩点) 的相关文章

随机推荐

  • Enlightenment官网介绍

    Enlightenment和EFL的官方网站 xff1a http www enlightenment org Enlightenment xff1a Enlightenment 是一个旗舰项目 它曾经是一个不起眼的 X11 窗口管理器 W
  • Enlightenment 是窗口管理器,Enlightenment 是桌面外壳,Enlightenment是创建漂亮应用程序的材料

    Enlightenment 是窗口管理器 xff0c Enlightenment 是桌面外壳 xff0c Enlightenment是创建漂亮应用程序的材料 xff0c Enlightenment xff0c 或者简单的一个 e xff0c
  • ubuntu安装nvidia显卡驱动报错:”The CC version check failed”

    参考过不少博主回答的问题 xff0c 但都存在很多问题 xff0c 或者比较麻烦 xff0c 给大家推荐一下我自己尝试解决后比较好的一个方案 xff1a 出现这个问题的原因是因为驱动可能比较新 xff0c 系统内核的gcc版本和编译器的默认
  • codeforces1169C 二分答案+思维

    1169C 1700的题 xff0c 然而比赛的时候没有做出来 题意 xff1a 给你一个n表示序列长度为n xff0c 还有一个m表示这个序列的最大值小于m 然后对这个数组进行多次操作 xff0c 一次操作为 对ai xff0c aj x
  • python用pip装第三方库numpy时报错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 7: ordi

    python用pip装第三方库numpy时一直报错 xff1a UnicodeDecodeError 39 ascii 39 codec can 39 t decode byte 0xc3 in position 7 ordinal not
  • debian8 jessie 更换为国内源

    编辑 etc apt sources list文件 xff1a 用 注释掉老的源 添加新的源 xff0c deb http mirrors 163 com debian jessie main non free contrib deb ht
  • 09、Flutter FFI Dart Native API

    Flutter FFI 学习笔记系列 Flutter FFI 最简示例 Flutter FFI 基础数据类型 Flutter FFI 函数 Flutter FFI 字符串 Flutter FFI 结构体 Flutter FFI 类 Flut
  • Copilot 自动编程AI工具

    OpenAI与GitHub联合构建的AI自动编程工具Copilot xff0c Copilot基于自然语言处理模型GPT 3搭建而成 xff0c Copilot预览版已经正式上线Visual Studio Code平台 OpenAI的GPT
  • SQLite的SQL语法

    SQLite库可以解析大部分标准SQL语言 但它也省去了一些特性 并且加入了一些自己的新特性 这篇文档就是试图描述那些SQLite支持 不支持的SQL语法的 查看关键字列表 如下语法表格中 xff0c 纯文本用蓝色粗体显示 非终极符号为斜体
  • 动态链接库dll(Windows/C++)

    1 概念 xff08 1 xff09 动态链接库广泛用于Windows系统及应用程序 xff0c 不能单独被执行 xff0c 在应用程序运行期间被动态调用的模块文件 区别于静态链接库 xff0c 均属于独立的代码编译模块 xff0c 但静态
  • 【Java】反射时获取父类属性并赋值

    1 反射获取父类 在反射获取类里的所有属性的时候 xff0c 会遇到无法访问父类extends里面的值 这时候需要访问父类需要调用Class的方法getSuperclass 对父类进行遍历field 同时如果不想遍历到Object或者某个类
  • linux软件包安装命令——apt-get

    apt get是linux中APT软件包的管理工具 采用shell命令行的方式完成软件的安装 更新 卸载等操作 1 语法 apt get xff08 选项 xff09 xff08 参数 xff09 选项 xff1a c 指定配置文件 o 直
  • 浅谈路由器的wan、lan、wlan口和vlan/trunk口

    背景 另一篇博文分析了一个实际的路由问题 xff0c 为方便问题分析 xff0c 在此列出常用概念 vlan中的trunk口 VLAN Trunk以及三层交换 可以把switch某一端口设为trunk 端口 问题 IP地址分类 xff1a
  • bzoj4864 [BeiJing 2017 Wc]神秘物质

    http www elijahqi win 2018 01 26 bzoj4864 beijing 2017 wc E7 A5 9E E7 A7 98 E7 89 A9 E8 B4 A8 20 E2 80 8E Description 21
  • mysql8设置远程连接详细教程

    这是转载StackOverFlow上的回答 xff0c 原回答点此这里 Remote Access in MySQL 8 Allow access from any host sudo nano etc mysql mysql conf d
  • 倒水问题(bfs)

    题意概述 34 fill A 34 表示倒满A杯 xff0c 34 empty A 34 表示倒空A杯 xff0c 34 pour A B 34 表示把A的水倒到B杯并且把B杯倒满或A倒空 Input 输入包含多组数据 每组数据输入 A B
  • A-化学

    题目概述 假设如上图 xff0c 这个烷烃基有6个原子和5个化学键 xff0c 6个原子分别标号1 6 xff0c 然后用一对数字 a b 表示原子a和原子b间有一个化学键 这样通过5行a b可以描述一个烷烃基 你的任务是甄别烷烃基的类别
  • B-评测系统

    题目概述 例如某次考试一共八道题 xff08 A B C D E F G H xff09 xff0c 每个人做的题都在对应的题号下有个数量标记 xff0c 负数表示该学生在该题上有过的错误提交次数但到现在还没有AC xff0c 正数表示AC
  • week4_C TT的神秘礼物

    题目描述 TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM 就会买一只可爱猫咪送给 TT
  • week8_C 班长竞选(Kosaraju算法 SCC缩点)

    题目描述 大学班级选班长 xff0c N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适 xff0c 意见具有传递性 xff0c 即 A 认为 B 合适 xff0c B 认为 C 合适 xff0c 则 A 也认为 C 合