c语言 多线程 传话,code vs1506传话(塔尖)+tarjan图文详解

1506 传话

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 白银 Silver

题目描述 Description

一个朋友网络,如果a认识b,那么如果a第一次收到某个消息,那么会把这个消息传给b,以及所有a认识的人。

如果a认识b,b不一定认识a。

所有人从1到n编号,给出所有“认识”关系,问如果i发布一条新消息,那么会不会经过若干次传话后,这个消息传回给了i,1<=i<=n。

输入描述 Input Description

第一行是n和m,表示人数和认识关系数。

接下来的m行,每行两个数a和b,表示a认识b。1<=a, b<=n。认识关系可能会重复给出,但一行的两个数不会相同。

输出描述 Output Description

一共n行,每行一个字符T或F。第i行如果是T,表示i发出一条新消息会传回给i;如果是F,表示i发出一条新消息不会传回给i。

样例输入 Sample Input

4 6

1 2

2 3

4 1

3 1

1 3

2 3

样例输出 Sample Output

T

T

T

F

数据范围及提示 Data Size & Hint

n<=1000

1<=a, b<=n

分类标签 Tags 点此展开

#include

#include

using namespace std;

int n,m,cnt,l;

int dfn[],low[],front[];

int s[];

bool v[];

bool ans[];

int cc[];

int top=;

struct node

{

int next,to;

}e[];

void add(int x,int y,int d)

{

e[d].to=y;

e[d].next=front[x];

front[x]=d;

}

void push(int x)

{

s[top++]=x;

v[x]=true;

}

void pop(int ll)

{

top--;

v[s[top]]=false;

cc[ll]=s[top];

}

void tarjer(int k)//目前根节点

{

dfn[k]=low[k]=++cnt;

push(k);

for(int i=front[k];i;i=e[i].next)//枚举与他相连的每一条边

{

int t=e[i].to;//指向的点

if(!dfn[t])

{

tarjer(t);

low[k]=min(low[k],low[t]);

}

else

{

if(v[t])

low[k]=min(low[k],dfn[t]);

}

}

if(low[k]==dfn[k])

{

l=;

while(dfn[s[top-]]!=dfn[k])

{

l++;

pop(l);

}

pop(++l);

}

if(l>)

{

for(int i=;i<=l;i++)

ans[cc[i]]=true;

}

}

int main()

{

freopen("message","r",stdin);

freopen("message.out","w",stdout);

scanf("%d%d",&n,&m);

for(int i=;i<=m;i++)

{

int x,y;

scanf("%d%d",&x,&y);

add(x,y,i);

}

for(int i=;i<=n;i++)

if(!dfn[i])

tarjer(i);

for(int i=;i<=n;i++)

if(ans[i]) printf("T\n");

else printf("F\n");

}

塔尖正解,这个题其实是塔尖的模板;

tarjan是一种求环的方法;

Tarjan算法

一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法。

Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。

定义dfn(u)为节点u搜索的次序编号,low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号。

当dfn(u)=low(u)时,以u为根的搜索子树上所有节点是一个强连通分量。

算法图解:

837a4f3c20c7c6c7f7ff6fe90d0496b2.png

55e89af7ff887366d32e86f9d4c8725d.png

6dd33cf2af7fa61a62a077cd547c9f19.png

ee977df82de6a36627d7332bd833d31f.png

bb6ec87c7bdc88f137f8c2d5afb13d33.png

4ea887e5ce75e64e434391a3eeeb971b.png

aaeb30a5bdc54883d8b222a2da62ebb2.png

3074f604f789d0d1665fcea3fecaeb8f.png

dab15302c755b5ed5b74872a20cf67e1.png

371d28799dc001855271adf3d6bf8625.png

8858fb02954237cccd9c79c509f76d66.png

f9c43082474a1ef16323bbb62a5f1d3c.png

73682d7459171156abb83cbfa6f9d29a.png

伪代码:

tarjan(u){

DFN[u]=Low[u]=++Index //为节点u设定次序编号和Low初值

Stack.push(u) //将节点u压入栈中

foreach(u,v) in E //枚举每一条边

if(v is not visted) //如果节点v未被访问过

tarjan(v) //继续向下找

Low[u]=min(Low[u],Low[v])

else if(v in S) //如果节点v还在栈内

Low[u]=min(Low[u],DFN[v])

if(DFN[u]==Low[u]) //如果节点u是强连通分量的根

repeat

v=S.pop//将v退栈,为该强连通分量中一个顶点

print v

until(u==v)

}

可以发现,运行Tarjan算法的过程中,每个顶点都被访问了一次,且只进出了一次堆栈,每条边也只被访问了一次,所以该算法的时间复杂度为O(N+M)。N为点数,M为边数。

CentOS 6&period;3下Samba服务器的安装与配置方法&lpar;图文详解&rpar;

这篇文章主要介绍了CentOS 6.3下Samba服务器的安装与配置方法(图文详解),需要的朋友可以参考下   一.简介  Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件, ...

GitHub 使用教程图文详解&lpar;转&rpar;

大纲: 一.前言 二.GitHub简介 三.注册GitHub账号 四.配置GitHub 五.使用GitHub 六.参与GitHub中其它开源项目 七.总结 注,GitHub官网:https://git ...

GitHub 使用教程图文详解

大纲: 一.前言 二.GitHub简介 三.注册GitHub账号 四.配置GitHub 五.使用GitHub 六.参与GitHub中其它开源项目 七.总结 注,GitHub官网:https://git ...

Java WebService接口生成和调用 图文详解&gt&semi;【转】【待调整】

webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

Windows下的Jupyter Notebook 安装与自定义启动(图文详解)

不多说,直接上干货! 前期博客 Windows下的Python 3.6.1的下载与安装(适合32bits和64bits)(图文详解) 这是我自定义的Python 的安装目录 (D:\SoftWare\ ...

APNS推送服务证书制作 图文详解教程(新)

iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务 ...

StreamSets学习系列之StreamSets的集群安装(图文详解)

不多说,直接上干货! 若是集群安装 需要在对应节点执行相同的操作. 见 StreamSets学习系列之StreamSets支持多种安装方式[Core Tarball.Cloudera Parcel . ...

StreamSets学习系列之StreamSets的Create New Pipeline(图文详解)

不多说,直接上干货! 前期博客 StreamSets学习系列之StreamSets支持多种安装方式[Core Tarball.Cloudera Parcel .Full Tarball .Full R ...

随机推荐

&lt&semi;&lt&semi;&lt&semi; tomcat启动报错StandardServer&period;await&colon; create&lbrack;8005&rsqb;

启动tomcat的时候出现异常 严重: StandardServer.await: create[8005]: java.net.BindException: Address already in u ...

孙鑫MFC学习笔记14&colon;网络编程

1.OSI 2.TCP/IP与OSI对应关系 3.Socket 4.客户机/服务器模式 5.Windows Sockets 6.套接字类型 7.面向连接的socket编程 8.面向无连接的socket ...

dubbox新特性介绍

dubbx是当当网对原阿里dubbo2.x的升级,并且兼容原有的dubbox.其中升级了zookeeper和spring版本,并且支持restfull风格的远程调用. dubbox git地址:  h ...

关于 hangfire 的权限问题

hangfire 是一个分布式后台执行服务. 官网:http://hangfire.io/ 我看中hangfire的地方是 1:使用简单 2:多种持久化保存方案.支持sqlserver ,msmq等 ...

数组在C&plus;&plus;和java中的区别

几乎所有的程序设计语言都支持数组.在C和C++中使用数组是很危险的.因为C和C++中的数组就是内存块.如果一个程序要访问其自身内存块之外的数组,或者在数组初始化之前使用它,都会产生难以预料的后果. j ...

ASP&period;NET MVC应用程序展示RDLC报表

原文:ASP.NET MVC应用程序展示RDLC报表 学习ASP.NET MVC这样久,在学习,练习与应用过程中,觉得很多知识与以前的ASP.NET多有区别,但是实现操作起来,细处又有许多相近的地方. ...

Android onTouchEvent方法

onTouchEvent方法简介 前面已经介绍了手机键盘事件的处理方法,接下来将介绍手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法, ...

&lbrack;python学习笔记&rsqb; String格式化

格式化 S % (args...) 方式 特点 str里的占位符同java里的占位符. 优势 这种方式可以限定格式化的时候接受的数据类型. 常见占位符 %d 接收数字,格式化为 十进制 %x 接收数字 ...

在 &period;NET项目中使用 Redis(2018&period;10&period;16)

1. 打开NuGet管理器搜索redis,安装:“StackExchange.Redis” 2. 配置 Web.config 文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值