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 通讯问题的更多相关文章

  1. cogs 1298. 通讯问题 Tarjan

    1298. 通讯问题 ★★   输入文件:jdltt.in   输出文件:jdltt.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员 ...

  2. Cogs 1298.通讯问题

    1298.通讯问题 ★ 输入文件:jdltt.in 输出文件:jdltt.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员都有联系方式(如电 ...

  3. cogs——1298. 通讯问题

    1298. 通讯问题 ★★   输入文件:jdltt.in   输出文件:jdltt.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员 ...

  4. tarjan算法--cojs 1298. 通讯问题

    cojs 1298. 通讯问题 ★   输入文件:jdltt.in   输出文件:jdltt.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员, ...

  5. kosaraju算法求强连通分量

    什么是强连通分量?在这之前先定义一个强连通性(strong connectivity)的概念:有向图中,如果一个顶点s到t有一条路径,t到s也有一条路径,即s与t互相可达,那么我们说s与t是强连通的. ...

  6. 通讯(tarjan缩点)(20190716NOIP模拟测试4)

    B. 通讯   题目类型:传统 评测方式:文本比较  内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了 ...

  7. 20190716NOIP模拟赛T2 通讯(tarjan缩点+贪心)

    题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部 ...

  8. cogs 1001. [WZOI2011 S3] 消息传递 Tarjan

    1001. [WZOI2011 S3] 消息传递 ★★   输入文件:messagew.in   输出文件:messagew.out   简单对比时间限制:1 s   内存限制:128 MB Prob ...

  9. cogs 619. [金陵中学2007] 传话 Tarjan强连通分量

    619. [金陵中学2007] 传话 ★★   输入文件:messagez.in   输出文件:messagez.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 兴趣小 ...

随机推荐

  1. NVisionXRFBXConverter(Beta版)实践课程

    一.前言 NVisionXR引擎使用的模型格式为.mesh(具体请看NVisionXR引擎基本介绍:http://www.arvrschool.com/read-7381 ),为了能够将常见的格式转换 ...

  2. java多线程的(一)-之java线程的使用

    一.摘要 每天都和电脑打交道,也相信大家使用过资源管理器杀掉过进程.而windows本身就是多进程的操作系统 在这里我们理解两组基本概念: 1.进程和线程的区别???? 2.并行与并发的区别???? ...

  3. js如何获取隐藏的元素的高度

    首先,正常情况下,确保div是有高度的. <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  4. 【详细】总结JavaWeb开发中SSH框架开发问题(用心总结,不容错过)

    在做JavaWeb的SSH框架开发的时候,遇到过很多的细节问题,这里大概记录下 我使用的IDE是Eclipse(老版本)三大框架:Spring4.Struts2.Hibernate5 1.web.xm ...

  5. 小草手把手教你 LabVIEW 串口仪器控制——初识VISA串口

    有些人,学习一样东西时候,喜欢现成的例子.很多人学习一门技术,都喜欢现成的例子开始,比如学单片机的啊,最开始都是修改的例子吧,学语言的也是.最开始都是模仿.这个年头看书上的理论知识太浪费时间了.所以啊 ...

  6. Network in Network

     论文要点: 用更有效的非线性函数逼近器(MLP,multilayer perceptron)代替 GLM 以增强局部模型的抽象能力.抽象能力指的模型中特征是对于同一概念的变体的不变形. 使用 gl ...

  7. 微信支付get_brand_wcpay_request:fail

    最近做了微信支付功能,和后端一起踩坑中,微信一直报错:get_brand_wcpay_request:fail 出现该问题的原因: 1.生成的sign签名有问题 2.支付授权目录配置有问题 在经过仔细 ...

  8. 为微软samples-for-ai贡献代码是种怎么样的体验?

    推送原文链接:传送门 关注SomedayWill,了解为微软项目贡献代码的始终. 还记得微软神器samples-for-ai吗?它可不仅仅可以用来安装框架,它其实是个开源的AI样例库,以Visual ...

  9. thinkphp中的常见静态常亮

    thinkphp __PUBLIC__的定义 __ROOT__等常量的定义 1 2 3 4 5 6 7 8 9 '__TMPL__'      =>  APP_TMPL_PATH,  // 项目 ...

  10. 初学深度学习(TensorFlow框架的心得and经验总结)自用环境的总结

    初学者的时间大部分浪费在了环境上了: 建议直接上Linux系统,我推荐国产的深度系统,deepin这几年一直在不断的发展,现在15.4已经很不错了 1,图形化界面很漂亮,内置正版crossover,并 ...