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. hibernate框架学习笔记5:缓存

    缓存不止存在与程序中,电脑硬件乃至于生活中都存在缓存 目的:提高效率 比如IO流读写字节,如果没有缓存,读一字节写一字节,效率低下 hibernate中的一级缓存:提高操作数据库的效率 示例: 抽取的 ...

  2. 网络1711-1712班 c 语言评分总表一览

    学号 姓名 作业地址 PTA实验作业5分 PTA排名2分 阅读代码2分 总结1分 代码规范扣分-2--0 总分 是否推荐博客 1 **莹 http://www.cnblogs.com/wwwwxy12 ...

  3. PTA题目的處理(四)

    题目7-3 求交错序列前N项和 1.实验代码 #include <stdio.h> //#include <stdlib.h> int main() { ,N; double ...

  4. C语言——第四次作业

    题目 题目一:计算分段函数 1.实验代码 #include <stdio.h> int main() { double x,y; scanf("%lf",&x) ...

  5. Flask 扩展 自定义扩展

    创建一个为视图访问加日志的扩展Flask-Logging,并从中了解到写Flask扩展的规范. 创建工程 先创建一个工程,目录结构如下: flask-logging/ ├ LICENSE # 授权说明 ...

  6. memmove 和 memcpy的区别以及处理内存重叠问题

    区别: memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const v ...

  7. codeforces 830 B Cards Sorting

    B. Cards Sorting  http://codeforces.com/problemset/problem/830/B Vasily has a deck of cards consisti ...

  8. ctf变量覆盖漏洞:

    1.变量覆盖: ①:针对extract函数的变量覆盖漏洞: <?php @error_reporting(E_ALL^E_NOTICE); require('config.php'); if($ ...

  9. kubernetes 手绘画,先收藏一下

  10. Eclipse在线更新慢

    一.去掉不必要的更新 打开Windows-Preferences -> Install/Update –> Available Software Sites,将不需要的更新停用 二.关闭自 ...