1001. [WZOI2011 S3] 消息传递

★★   输入文件:messagew.in   输出文件:messagew.out   简单对比
时间限制:1 s   内存限制:128 MB

Problem 2 消息传递 (messagew.pas/c/cpp)
问题描述
WZland开办了一个俱乐部(这里面可以干任何的事情),这引来了许多的人来加入。俱乐部的人数越来越多,关系也越来越复杂……
俱乐部的人来自各个地方,为了增加友谊,俱乐部举行了一次晚会。晚会上又进行了一个传话游戏,如果A认识B,那么A收到某个消息,就会把这个消息传给B,以及所有A认识的人(如果A认识B,B不一定认识A),所有人从1到N编号。
现在给出所有“认识”关系,俱乐部的负责人WZland的国王想知道一个十分简单的问题:如果A发布一条新消息,那么会不会经过若干次传话后,这个消息传回给了A,1≤A≤N。但是WZland的国王是出了名的数学差,幸好的是你在他的身边,于是他就将这个问题交给你来解决。
输入格式
输入数据中的第一行是两个数N和M,两数之间有一个空格,表示人数和认识关系数。
接下来的M行,每行两个数A和B,表示A认识B(1A, BN,AB)。
输出格式
输出文件中一共有N行,每行一个字符“T”或“F”。第i行如果是“T”,表示i发出一条新消息会传回给i;如果是“F”,表示i发出一条新消息不会传回给i。
样例输入输出
messagwe.in 
4 6
1 2
2 3
4 1
3 1
1 3
2 3
messagew.out
T
T
T
F
数据规模
对于30%的数据,N≤1000,M≤20000;
对于50%的数据,N≤10000,M≤100000;
对于100%的数据,N≤100000,M≤200000;
认识关系可能会重复给出。
时间限制
1s

这一道题其实还是比较简单的 就是一个Tarjan而已
那么应该怎么进行处理呢??只要  当前点所在的强连通分量的大小>1 就相当于 这个点传出去以后 还能有人再给他传回来!else  就是他自己一个人 肯定不行啦

至于那个认识关系可能会重复。。。我一开始也没有想到怎样处理 就闭着眼交了上去 居然A了 后来想明白了(还是板子高明啊)快看快看:

那个第67行看到没  就是如果to点已经在栈中了  就把当前点的low 和 to点的dfn取一个较小的值 直接就返回了 不会出bug了

(<<本人心声:清华orz的板子就是厉害!赞一个)

下面来贴出简洁清晰(自认为)的代码吧

#include<vector>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 100005
using namespace std;
int n,m;
vector<int> v[maxn];
int dfn[maxn],low[maxn],size[maxn],scc_cnt,st[maxn],cnt,tim,belong[maxn];
bool bein[maxn];
void Tarjan(int rt)
{
dfn[rt]=low[rt]=++tim;//时间戳++ 初始化dfn和low相等
st[++cnt]=rt;//该点入栈
bein[rt]=true; //标记是否在栈中的数组
for(int i=;i<v[rt].size();i++)
{
int to=v[rt][i];
if(!dfn[to])
Tarjan(to),low[rt]=min(low[rt],low[to]);
else if(bein[to])
low[rt]=min(low[rt],dfn[to]);
}
if(dfn[rt]==low[rt])
{
scc_cnt++;//统计强连通分量
int k;
do{
k=st[cnt];
cnt--;
belong[k]=scc_cnt;
bein[k]=false;
size[scc_cnt]++;
}while(k^rt);//^ 在这里就相当于!= do while 是先跑一遍再判断
}
}
int main()
{
freopen("messagew.in","r",stdin);
freopen("messagew.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x,y;scanf("%d%d",&x,&y);
v[x].push_back(y);//这里要注意是一条单项边啊
}
for(int i=;i<=n;i++)
if(!dfn[i])//如果未访问
Tarjan(i);
for(int i=;i<=n;i++)
{
if(size[belong[i]]>)
puts("T");
else
puts("F");
}
return ;
}

cogs 1001. [WZOI2011 S3] 消息传递 Tarjan的更多相关文章

  1. cogs——1001. [WZOI2011 S3] 消息传递

    1001. [WZOI2011 S3] 消息传递 ★★   输入文件:messagew.in   输出文件:messagew.out   简单对比时间限制:1 s   内存限制:128 MB Prob ...

  2. cojs 1001. [WZOI2011 S3] 消息传递

    1001. [WZOI2011 S3] 消息传递 ★★   输入文件:messagew.in   输出文件:messagew.out   简单对比时间限制:1 s   内存限制:128 MB Prob ...

  3. 消息传递(cogs 1001)

    问题描述WZland开办了一个俱乐部(这里面可以干任何的事情),这引来了许多的人来加入.俱乐部的人数越来越多,关系也越来越复杂……俱乐部的人来自各个地方,为了增加友谊,俱乐部举行了一次晚会.晚会上又进 ...

  4. 求图的强连通分量--tarjan算法

    一:tarjan算法详解 ◦思想: ◦ ◦做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间 ...

  5. 【u115】&&【t031】 01迷宫

    01迷宫(maze01) Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相 ...

  6. 集合-Collection接口

    集合 和 数组 的比较: 数组 - 本质上就是在内存空间中申请的一段连续内存空间,存放多个相同类型的数据 - 数组一旦定义完毕,则在内存空间中的长度固定. - 插入/删除元素时可能导致大量元素的移动, ...

  7. cogs 943. [東方S3] 铃仙•优昙华院•稻叶

    二次联通门 : cogs 943. [東方S3] 铃仙•优昙华院•稻叶 /* cogs 943. [東方S3] 铃仙·优昙华院·稻叶 概率dp 貌似做麻烦了 邻接矩阵和链式前向星都用上了... dp[ ...

  8. cogs 944. [東方S3] 藤原妹红

    二次联通门 : cogs 944. [東方S3] 藤原妹红 /* cogs 944. [東方S3] 藤原妹红 最小生成树 + 树形dp 首先对原图跑最下生成树 后建出一棵树 在树上进行dp 先走到叶子 ...

  9. tarjan——cogs 1298 通讯问题

    1298. 通讯问题 ★   输入文件:jdltt.in   输出文件:jdltt.out   简单对比 时间限制:1 s   内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员 ...

随机推荐

  1. joinColumns和inverseJoinColumns的用法

    最近在工作中使用springside,里面用到了hibernate的多对多 一开始我在配置department(部门表)和menu(栏目表)的时候,这样写的. Department实体类中的getMe ...

  2. Innodb_large_prefix

    innodb_large_prefix Prefixes, defined by the length attribute, can be up to 767 bytes long for InnoD ...

  3. python3快捷键

    原文:https://blog.csdn.net/pipisorry/article/details/39909057 PyCharm3.0默认快捷键(翻译的) PyCharm Default Key ...

  4. Springboot学习笔记(一)—— 安装

    springboot越来越流行了,相比较于springMVC,springboot采用了一种约定大于配置的理念,可以一键安装,一键运行,一键部署,内置tomcat,省去了一大堆配置的时间,并且,spr ...

  5. js基础——变量、作用域、内存

    1.new关键字创建的是引用类型: eg. var box = new Object();      box.name = "Linda";//引用类型添加属性没问题     al ...

  6. Spring激活profile的方式

    Spring中激活profile的方法:设置spring.profiles.active和spring.profiles.default这两个属性 设置激活profile属性的地方(优先级由高到底) ...

  7. MV*模式

    MV*模式 MVC框架最早出现在Java领域,然后慢慢在前端开发中也被提到,后来又出现了MVP,以及现在最成熟的MVVM. MVC model 数据模型 view 视图 controller 控制器 ...

  8. C# 判断系统版本

    本文告诉大家如何判断系统是 win7 还是 xp 系统 使用下面代码可以判断 private static readonly Version _osVersion = Environment.OSVe ...

  9. UE4 中的 C++ 与 蓝图交互

    1.Unreal 引擎提供了两种创建新 Gameplay 元素的方法:C++ 和 蓝图视觉脚本. 通过 C++,程序员构建基础游戏系统:设计师可以基于此系统为场景 / 游戏创建自定义的游戏玩法. 这种 ...

  10. Rancher2.x部署K8s

    1.安装Docker [root@localhost ~]# docker -v Docker version , build 774a1f4 2.使用Docker运行Rancher : stable ...