cogs 1001. [WZOI2011 S3] 消息传递 Tarjan
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的更多相关文章
- cogs——1001. [WZOI2011 S3] 消息传递
1001. [WZOI2011 S3] 消息传递 ★★ 输入文件:messagew.in 输出文件:messagew.out 简单对比时间限制:1 s 内存限制:128 MB Prob ...
- cojs 1001. [WZOI2011 S3] 消息传递
1001. [WZOI2011 S3] 消息传递 ★★ 输入文件:messagew.in 输出文件:messagew.out 简单对比时间限制:1 s 内存限制:128 MB Prob ...
- 消息传递(cogs 1001)
问题描述WZland开办了一个俱乐部(这里面可以干任何的事情),这引来了许多的人来加入.俱乐部的人数越来越多,关系也越来越复杂……俱乐部的人来自各个地方,为了增加友谊,俱乐部举行了一次晚会.晚会上又进 ...
- 求图的强连通分量--tarjan算法
一:tarjan算法详解 ◦思想: ◦ ◦做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间 ...
- 【u115】&&【t031】 01迷宫
01迷宫(maze01) Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相 ...
- 集合-Collection接口
集合 和 数组 的比较: 数组 - 本质上就是在内存空间中申请的一段连续内存空间,存放多个相同类型的数据 - 数组一旦定义完毕,则在内存空间中的长度固定. - 插入/删除元素时可能导致大量元素的移动, ...
- cogs 943. [東方S3] 铃仙•优昙华院•稻叶
二次联通门 : cogs 943. [東方S3] 铃仙•优昙华院•稻叶 /* cogs 943. [東方S3] 铃仙·优昙华院·稻叶 概率dp 貌似做麻烦了 邻接矩阵和链式前向星都用上了... dp[ ...
- cogs 944. [東方S3] 藤原妹红
二次联通门 : cogs 944. [東方S3] 藤原妹红 /* cogs 944. [東方S3] 藤原妹红 最小生成树 + 树形dp 首先对原图跑最下生成树 后建出一棵树 在树上进行dp 先走到叶子 ...
- tarjan——cogs 1298 通讯问题
1298. 通讯问题 ★ 输入文件:jdltt.in 输出文件:jdltt.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员 ...
随机推荐
- python模块之模块导入
模块的导入 """ 模块的导入使用:模块导入一般都要放在代码的最上面 不同模块的导入顺序: 1 内置模块 2 扩展模块 3 自定义模块 """ ...
- 2019年湘潭大学程序设计竞赛(重现赛)F.Black&White
传送门 F.Black&White •题意 操作 m 次后,求连续的1或连续的0的最大值,每次操作只能反转一个位置: •思路1(反悔操作) 定义队列q:依次存放两个零之间的1的个数+1: 首先 ...
- P1013 高精度加法
题目描述 给你两个很大的正整数A和B,你需要计算他们的和. 输入格式 输入一行包含两个正整数A和B,以一个空格分隔(A和B的位数都不超过 \(10^5\)) 输出格式 输出一行包含一个整数,表示A+B ...
- linux seqlock 锁
内核包含了一对新机制打算来提供快速地, 无锁地存取一个共享资源. seqlock 在这 种情况下工作, 要保护的资源小, 简单, 并且常常被存取, 并且很少写存取但是必须要快. 基本上, 它们通过允许 ...
- Git的使用--如何将本地项目上传到Github(两种简单、方便的方法..)
https://blog.csdn.net/u014135752/article/details/79951802 总结:其实只需要进行下面几步就能把本地项目上传到Github 1.在本地创建一个版本 ...
- ZR并查集专题
ZR并查集专题 并查集,作为一个基础算法,对于初学者来说,下面的代码是维护连通性的利器 return fa[x] == x ? x : fa[x] = getf(fa[x]); 所以,但是这对并查集的 ...
- H3C进入目录---用户视图
进入logfile文件目录 <H3C>cd logfile/ //进入目录 <H3C>pwd //显示当前所属的目录 cf:/logfil ...
- Vue2.0 Vue.set的使用
原文链接: https://blog.csdn.net/qq_30455841/article/details/78666571
- SPOJ - REPEATS Repeats (后缀数组)
A string s is called an (k,l)-repeat if s is obtained by concatenating k>=1 times some seed strin ...
- Avram Joel Spolsky给计算机系学生的建议
Avram Joel Spolsky给计算机系的学生给了如下建议: (1)毕业前练好写作 (2)毕业前学好C语言 (3)毕业前学好微观经济学 (4)不要因为枯燥就不选修 ...