tarjan——cogs 1298 通讯问题
1298. 通讯问题
★ 输入文件:jdltt.in 输出文件:jdltt.out 简单对比
时间限制:1 s 内存限制:128 MB
【题目描述】
一个篮球队有n个篮球队员,每个队员都有联系方式(如电话、电子邮件等)。但并不是每个队员的联系方式都公开,每个队员的联系方式只有一部分队员知道。问队员可以分成多少个小组,小组成员之间可以相互通知(包括一个队员一个组,表示自己通知自己)。
【输入格式】
输入文件有若干行
第一行,一个整数n,表示共有n个队员(2<=n<=100)
下面有若干行,每行2个数a、b,a、b是队员编号,表示a知道b的通讯方式。
【输出格式】
输出文件有若干行
第一行,1个整数m,表示可以分m个小组,下面有m行,每行有若干个整数,表示该小组成员编号,输出顺序按编号由小到大。
【样例输入】
12
1 3
2 1
2 4
3 2
3 4
3 5
4 6
5 4
6 4
7 4
7 8
7 12
8 7
8 9
10 9
11 10
【样例输出】
8
1 2 3
4 6
5
7 8
9
10
11
12
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm> #define M 200 using namespace std; int pp[M];
int tk[M],top=;
bool stk[M]; //标记点是否已在队列中
int dfn[M]; //记录点的标号
int low[M]; //记录点的最小上溯点位
int cnum=; //统计强连通分量个数
int dex=; //入队编号
vector <int> edge[M]; //储存边
int com[M][M]; //储存强连通分量(原来用的是动态数组,但是忘了动态数组怎么排序了……所以换成了二维数组)
int n; void input();
void output();
void tarjan(int);
void chushihua();
void jiaohuan(int,int); int main()
{
freopen("jdltt.in","r",stdin);
freopen("jdltt.out","w",stdout);
input();
chushihua();
output();
fclose(stdin);fclose(stdout);
return ;
} void input()
{ scanf("%d",&n);
int a,b;
while(scanf("%d%d",&a,&b)==)
{
edge[a].push_back(b);
}
} void chushihua() //各种初始化……
{
memset(tk,-,sizeof(tk));
memset(stk,,sizeof(stk));
memset(dfn,-,sizeof(dfn));
memset(low,-,sizeof(low));
for(int i=;i<=n;i++) //如果对该点还没入队过就跑一次tarjan
if(dfn[i]==-)
tarjan(i);
} void tarjan(int i)
{
int j;
dfn[i]=low[i]=dex++;
stk[i]=true; //入队标记
tk[++top]=i; //入队
for(int e=;e<edge[i].size();e++) //遍历所有与该点相连的点
{
j=edge[i][e];
if(dfn[j]==-) //情况一:点未入队——入队跑tarjan
{
tarjan(j);
low[i]=min(low[i],low[j]);
}
else
if(stk[j]==) //情况二:已入过对且正在队中
low[i]=min(low[i],dfn[j]);
}
if(dfn[i]==low[i]) //强连通分量标识
{
cnum++;
do
{
j=tk[top--];
// printf("%d ",j);
stk[j]=false;
com[cnum][]++;
com[cnum][com[cnum][]]=j;
}
while(j!=i);
}
}
/*
void jiaohuan(int a,int b)
{
memset(pp,0,sizeof(pp));
int i=0;
while(cc[a][i]!=0)
{pp[i]=cc[a][i];i++;}
memset(cc[a],0,sizeof(cc[a]));
i=0;
while(cc[b][i]!=0)
cc[a][i]=cc[b][i],i++;
memset(cc[b],0,sizeof(cc[b]));
i=0;
while(pp[i]!=0)
cc[b][i]=pp[i],i++;
}
*/ void output()
{
printf("%d\n",cnum);
for(int k=;k<=cnum;k++) //先把每个强连通分量里的点按从小到大排序
//(有智商的孩子就不要像我一样用冒泡排序了……)
{
int p=com[k][];
for(int i=;i<=p;i++)
for(int j=i+;j<=p;j++)
if(com[k][i]>com[k][j])
{
int b=com[k][i];
com[k][i]=com[k][j];
com[k][j]=b;
}
}
for(int i=;i<=cnum;i++) //把强连通分量按首的大小从小到大排序,依旧是冒泡……
for(int j=i+;j<=cnum;j++)
if(com[i][]>com[j][]) //我的com[i][0]储存的是第i个强连通分量包含几个点
{
memset(pp,,sizeof(pp));
for(int k=;k<=com[i][];k++)
pp[k]=com[i][k];
for(int k=;k<=com[j][];k++)
com[i][k]=com[j][k];
for(int k=;k<=pp[];k++)
com[j][k]=pp[k];
}
for(int i=;i<=cnum;i++) //真正的输出过程……
{
for(int j=;j<=com[i][];j++)
printf("%d ",com[i][j]);
printf("\n");
}
}
tarjan
tarjan——cogs 1298 通讯问题的更多相关文章
- cogs 1298. 通讯问题 Tarjan
1298. 通讯问题 ★★ 输入文件:jdltt.in 输出文件:jdltt.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员 ...
- Cogs 1298.通讯问题
1298.通讯问题 ★ 输入文件:jdltt.in 输出文件:jdltt.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员都有联系方式(如电 ...
- cogs——1298. 通讯问题
1298. 通讯问题 ★★ 输入文件:jdltt.in 输出文件:jdltt.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员 ...
- tarjan算法--cojs 1298. 通讯问题
cojs 1298. 通讯问题 ★ 输入文件:jdltt.in 输出文件:jdltt.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员, ...
- kosaraju算法求强连通分量
什么是强连通分量?在这之前先定义一个强连通性(strong connectivity)的概念:有向图中,如果一个顶点s到t有一条路径,t到s也有一条路径,即s与t互相可达,那么我们说s与t是强连通的. ...
- 通讯(tarjan缩点)(20190716NOIP模拟测试4)
B. 通讯 题目类型:传统 评测方式:文本比较 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了 ...
- 20190716NOIP模拟赛T2 通讯(tarjan缩点+贪心)
题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部 ...
- cogs 1001. [WZOI2011 S3] 消息传递 Tarjan
1001. [WZOI2011 S3] 消息传递 ★★ 输入文件:messagew.in 输出文件:messagew.out 简单对比时间限制:1 s 内存限制:128 MB Prob ...
- cogs 619. [金陵中学2007] 传话 Tarjan强连通分量
619. [金陵中学2007] 传话 ★★ 输入文件:messagez.in 输出文件:messagez.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 兴趣小 ...
随机推荐
- 201621123062《java程序设计》第14周作业总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 思维导图: 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的 ...
- win7 Anaconda 安装 scrapy模块
之前用了很多方法,都安装不成功,今天终于成功了..说下方法.. anaconda的清华镜像:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ ...
- 项目Beta冲刺Day7
项目进展 李明皇 今天解决的进度 部分数据传递和使用逻辑测试 林翔 今天解决的进度 服务器端查看个人发布的action,修改已发布消息状态的action,仍在尝试使用第三方云存储功能保存图片 孙敏铭 ...
- ubuntu1604使用源码方式安装ruby2.5.0
本文介绍ubutntu1604环境下源代码方式安装ruby 版本2.5.0 如果内存小于2G可以开启虚拟内存,下面的命令开启4G虚拟内存 sudo dd if=/dev/zero of=/swap b ...
- 十、Python练习----基础搭建飞机大战
只是简单的学习了pygame,实现飞机的摧毁还需要多张图片的切换,和sprite(碰撞精灵),还有多种音效的添加(如背景音乐.摧毁特效).以后再深入学习我只是练习一下python. 一.搭建界面(基于 ...
- SourceTree 实现 git flow 流程
为什么使用 git 和 git flow,这篇文章 深入理解学习Git工作流 的内容相信能够给你一个完整的答案. 我们以使用SVN的工作流来使用git有什么不妥? git 方便的branch在哪里,团 ...
- 09-移动端开发教程-Sass入门
1. 引言 CSS3之前的CSS都大都是枚举属性样式,而编程语言强大的变量.函数.循环.分支等功能基本都不能在CSS中使用,让CSS的编程黯淡无光,Sass就是一种增强CSS编程的扩展语言(CSS4也 ...
- js中多维数组转一维
法一:使用数组map()方法,对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组. var arr = [1,[2,[[3,4],5],6]]; function unid(arr){ v ...
- CDH:5.14.0 中 Hive BUG记录
CDH5.14.0使用的HIVE版本: 自建表log: +----------------------------------------------------+--+ | createtab_st ...
- JAVA_SE基础——72.自定义线程
进程 : 正在执行的程序称作为一个进程. 进程负责了内存空间的划分. 问题: windows号称是多任务的操作系统,那么windows是同时运行多个应用程序吗?从宏观的角度: windows确 ...