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. Alpha第七天

    Alpha第七天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...

  2. C语言函数2

    一.PTA实验作业 6-3 使用函数判断完全平方数: 1. 本题PTA提交列表: 2. 设计思路: 3.本题调试过程碰到问题及PTA提交列表情况说明: 1.一开始考虑让输入值N去整除一个循环变量i,i ...

  3. iOS开发-OC分支结构

     BOOL类型 返回值:真:YES  假:NO BOOL数据类型占一个字节的内存空间,占位符为%d. 计算机在识别时,YES就替换成1,NO就替换成0. bool是C语言中的布尔类型,返回值为true ...

  4. (原创)不带模板的OLE输出EXCEL

    目前我已知的EXCEL输出方式有3种: 1.GUI_DOWNLOAD函数输出(适用于简单无格式要求的输出). 2.OLE输出(适用于对EXCEL格式输出有特殊要求的,但是因其填充数据和设置格式是基于一 ...

  5. Trie树(转)

    原文http://www.cnblogs.com/TheRoadToTheGold/p/6290732.html 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看 ...

  6. JAVA_SE基础——35.static修饰成员函数

    在Java中适用static关键字修饰的方法称为静态方法. 声明静态方法的语法格式如下: 权限修饰符 static 数据类型 方法名(){ 方法体 } 静态方法 可以使用类名直接调用     类名.方 ...

  7. DNS搜索过程

    以www.renyi.com为例 一:客户端首先检查本地HOST文件,是否有对应的IP地址,如果有,客户端直接访问,如果没有,则执行下一步. 二:客户端查看本地缓存信息,是否有对应的IP地址,如果有, ...

  8. java异常常见面试问题

    java异常常见面试问题 一.java异常的理解 异常主要是处理编译期不能捕获的错误.出现问题时能继续顺利执行下去,而不导致程序终止,确保程序的健壮性. 处理过程:产生异常状态时,如果当前的conte ...

  9. Oracle 使用pl/sql将表中的数据读出到文件中

    (1)在服务器上创建文件路径及文件 [oracle@redhat errormsg]$ touch test01.txt (2)在数据库中创建路径及授权 (3)创建存储过程 CREATE OR REP ...

  10. maven构建spring报错org.springframework.core.NestedRuntimeException cannot be resolved.

    Error:The type org.springframework.core.NestedRuntimeException cannot be resolved. It is indirectly ...