【COGS1298】通讯问题

Description

一个篮球队有n个篮球队员,每个队员都有联系方式(如电话、电子邮件等)。但并不是每个队员的联系方式都公开,每个队员的联系方式只有一部分队员知道。问队员可以分成多少个小组,小组成员之间可以相互通知(包括一个队员一个组,表示自己通知自己)。

Input

输入文件有若干行

第一行,一个整数n,表示共有n个队员(2<=n<=100)

下面有若干行,每行2个数a、b,a、b是队员编号,表示a知道b的通讯方式。

Output

输出文件有若干行

第一行,1个整数m,表示可以分m个小组,下面有m行,每行有若干个整数,表示该小组成员编号,输出顺序按编号由小到大。

Sample Input

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

Sample Output

8

1 2 3

4 6

5

7 8

9

10

11

12

题解

tarjan求有多少了连通块,并按顺序输出

输出 先给每个块中元素排序,在对每个块排序(按照头元素大小)

#include <cstdio>
#include <iostream>
#include<algorithm>
#define N 200
using namespace std;
struct edge
{
    int to,next;
}e[N*N];
struct node
{
    int c[N],size;
}p[N];
int dfn[N],Low[N],sz[N];
int index,Count;
bool instack[N];
int s[N],top;
int head [N];
int cnt;
void ins(int u,int v)
{
    e[++cnt].to = v; e[cnt].next = head[u]; head[u] = cnt;
}
void tarjan(int k){

    dfn[k]=Low[k]=++index;
    instack[k]=true; s[++top]=k;
    for (int i=head[k];i;i=e[i].next)
    {
        int j=e[i].to;
        if(dfn[j]==0){
            tarjan(j);
            Low[k]=min(Low[k],Low[j]);
        }else if(instack[j]) Low[k]=min(Low[k],dfn[j]);
    }
    if(dfn[k]==Low[k])
    {
        int j;
        Count++;
        do{
            j=s[top--]; instack[j]=false;
            p[Count].size++;
            sz[p[Count].size] = j;
        }while(j!=k);
        sort(sz+1,sz+p[Count].size+1);
        for (int i=1;i<=p[Count].size;i++)
            p[Count].c[i] = sz[i];
    }
}
int cmp(const node &a,const node &b)
{
    return a.c[1] < b.c[1];
}
int cmp2(const int &a,const int &b)
{
    return a<b;
}
int main(){
    int m,u,v,n=0;
    freopen("jdltt.in","r",stdin);
    freopen("jdltt.out","w",stdout);
    scanf("%d",&n);
    while (scanf("%d%d",&u,&v)==2)
        ins(u,v);
    for(int i=1;i<=n;i++)
        if(dfn[i]==0)
            tarjan(i);
    sort(p+1,p+1+Count,cmp);
    printf("%d\n",Count);
    for(int i=1;i<=Count;i++)
    {
        for (int j=1;j<=p[i].size;j++)
            printf("%d ",p[i].c[j]);
        printf("\n");
    }
    return 0;
}
时间: 2024-08-05 12:03:07

【COGS1298】通讯问题的相关文章

Android网络通讯简介

网络通信应该包含三部分的内容:发送方.接收方.协议栈.发送方和接收方是参与通信的主体,协议栈是发送方和接收方进行通信的契约.按照服务类型,网络通信可分为面向连接和无连接的方式.面向连接是在通信前建立通信链路,而通信结束后释放该链路.无连接的方式则不需要在通信前建立通信连接,这种方式不保证传输的质量. Android提供了多种网络通信的方式,如Java中提供的网络编程,在Android中都提供了支持.Android中常用的网络编程方式如下: 针对TCP/IP协议的Socket和ServerSock

用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯

最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 WIFI模块实现了这个功能.下面向大家就简单分享一下. 工具:网络调试助手  ESP8266  STM32F1开发板 首先,用网络调试助手来虚拟一个服务器,如下: 有了服务器后,接下来我们就要用WIFI来连接这个服务器.ESP8266 有三种工作模式,由于项目要求,我选用了STA中的客户端模式.下面

java SSM框架 多数据源 代码生成器 websocket即时通讯 shiro redis 后台框架源码

获取[下载地址]   QQ: 313596790官网 http://www.fhadmin.org/A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块C 集成阿里巴巴数据库连接池druid  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都

线程通讯

/* 线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务. 生产者与消费者 wait(): 等待 如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒. notify(): 唤醒 唤醒线程池等待线程其中的一个. notifyAll() : 唤醒线程池所有等待 线程. wait与notify方法要注意的事项: 1. wait方法与notify方法是属于Object对象 的. 2. wait方法与notify方

网络通讯协议

TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据.关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP.FTP.TELNET等,也可以自己定义应用层协议.WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做

Android开发之实现两个手机之间的通讯

欢迎转载,转载请注明出处:http://blog.csdn.net/dmk877/article/details/51685656 Hello,大家好,今天又来写博客了,项目终于搞完了最近又有时间写写博客了.在上上篇博客中我们学习了Android中网络通讯,并用Socket实现了Android客户端与服务器的通讯,那么这一篇将进一步来完善这一功能,就是要实现两个android手机端的通讯. 如有谬误,欢迎批评指正,如有疑问欢迎留言 通过本篇博客你将学到以下知识点 ①Socket的用法 ②如何实现

XMPP即时通讯

XMPP:XMPP是基于XML的点对点通讯协议,The Extensible Messaging and Presence Protocol(可扩展通讯和表示协议). XMPP可用于服务类实时通讯,表示和需求响应服务中的XML数据元流失传输.XMPP以Jabber协议为基础,而Jabber是即时通讯中常用的开放式协议. 基本结构. XML是一个典型的C/S架构,而不是像大多数即时通讯软件一样,使用P2P客户端到客户端的架构,也就是说在大多数情况下,当两个客户端进行通讯时,他们的消息都是通过服务器

基于NIO的消息路由的实现(四) 服务端通讯主线程(2)断包和粘包的处理

本来我打算单独开一章,专门说明粘包和断包,但是觉得这个事儿我在做的时候挺头疼的,但是对于别人或许不那么重要,于是就在这里写吧. 那么何谓粘包.何谓断包呢? 粘包:我们知道客户端在写入报文给服务端的时候,首先要将需要写入的内容写入Buffer,以ByteBuffer为例,如果你Buffer定义的足够大,并且你发送的报文足够快,此时就会产生粘包现象,举例来说 你发送一个 报文" M|A",然后你有发送了一个"M|B",如果产生粘包,服务端从缓冲区里面读出的就是"

【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动

SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    导出数据接口的作用 在数据集成系统项目中,要么是自已集成其他厂家的设备,要么是其他厂家集成自己家的设备,在没有统一的标准前提下,就会有各种集成数据的格式.为了满足此类的场景,为设备输出数据专门设计了接口,开发者可以继承该接口,设备在处理完数据后,会把数据自动传输到该接口,可以按规定的数据格式进行输出了. 1.2    接口功能说明 开发设备输出接口,主要考虑到在集成项目中,集成过程中或被集成