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. JavaWeb学习笔记八 监听器

    监听器Listener jservlet规范包括三个技术点:servlet :listener :filter:监听器就是监听某个对象的的状态变化的组件.监听器的相关概念事件源: 被监听的对象(三个域 ...

  2. 1013团队Beta冲刺day6

    项目进展 李明皇 今天解决的进度 进行前后端联动调试 明天安排 完善程序运行逻辑 林翔 今天解决的进度 服务器端发布消息,删除消息,检索消息,个人发布的action 明天安排 图片功能遇到问题,微信小 ...

  3. Beta冲刺Day5

    项目进展 李明皇 今天解决的进度 服务器端还未完善,所以无法进行联动调试.对页面样式和逻辑进行优化 明天安排 前后端联动调试 林翔 今天解决的进度 完成维护登录态,实现图片上传,微信开发工具上传图片不 ...

  4. Mybatis学习日志

    在Mybatis深入学习的一周中,总感觉跟着师傅的视屏讲解什么都能懂,但实际自己操作的时候才发现自己一脸懵逼,不知道从何入手.但还好自己做了点笔记.在此记录一下自己浅度学习Mybatis遇到几个小问题 ...

  5. Spring mvc中junit测试遇到com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException错误怎么解决

    今天遇到图片中的错误,纠结了一下,弄清楚了怎么从控制台中读取错误信息,并修改错误. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: ...

  6. 爬虫小探-Python3 urllib.request获取页面数据

    使用Python3 urllib.request中的Requests()和urlopen()方法获取页面源码,并用re正则进行正则匹配查找需要的数据. #forex.py#coding:utf-8 ' ...

  7. python-装饰器简述

    装饰器是什么 用来修饰别的函数的函数就可以称之为装饰器 这种函数的参数一般就是另外一个函数 也就是说,调用这种函数,需要给这种函数传参,且参数是函数 @语法糖 @语法糖一般用来表示装饰器函数 不用@也 ...

  8. 逆向集录_00_不同程序OEP特征总结

    在分析/逆向 程序时,如果事先知道这类程序的一些特征,那将会是事半功倍的: 分析/逆向 程序,和写程序不同,比喻的话:写程序像在作案,分析/逆向 程序就像是在破案,对破案来讲,重在假想和推理: 特征1 ...

  9. Python内置函数(2)——divmod

    英文文档: divmod(a, b) Take two (non complex) numbers as arguments and return a pair of numbers consisti ...

  10. Kompose: Docker-compose 到 Kubernetes 的迁移工具

    Docker 让每个人都能够从 Docker Registry 启动一个打包好的 Docker 应用.Docker-Compose在Docker基础上解决了多容器应用之间的依赖启动问题. Docker ...