码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-08-24 10:19:50      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:stack   接下来   read   getc   消息   tarjan   负责人   问题:   tac   

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。
样例输入输出
message.in 
4 6
1 2
2 3
4 1
3 1
1 3
2 3
message.out
T
T
T
F

 

数据规模
对于30%的数据,N≤1000,M≤20000;
对于50%的数据,N≤10000,M≤100000;
对于100%的数据,N≤100000,M≤200000;
认识关系可能会重复给出。
时间限制
1s

tarjan求强连通分量,判断该点所在的强连通分量中的点的个数,若该点所在的强连通分量里的点的个数多于一个则说明出现了环,那么就会自己传递的信息再次传给自己、、

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 210000
using namespace std;
bool vis[N];
int n,m,x,y,tot,sum,tim,top;
int dfn[N],low[N],ans[N],head[N],stack[N],belong[N];
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1; ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0; ch=getchar();}
    return x*f;
}
struct Edge
{
    int to,from,next;
}edge[N];
int add(int x,int y)
{
    tot++;
    edge[tot].to=y;
    edge[tot].next=head[x];
    head[x]=tot;
}
int tarjan(int now)
{
    dfn[now]=low[now]=++tim;
    stack[++top]=now,vis[now]=true;
    for(int i=head[now];i;i=edge[i].next)
    {
        int t=edge[i].to;
        if(vis[t]) low[now]=min(dfn[t],low[now]);
        else if(!dfn[t]) tarjan(t),low[now]=min(low[now],low[t]);
    }
    if(dfn[now]==low[now])
    {
        sum++;belong[now]=sum;ans[sum]++;
        for(;stack[top]!=now;top--)
        {
            int x=stack[top];
            vis[x]=false;belong[x]=sum,ans[sum]++;
        }
        top--,vis[now]=false;
    }
}
int main()
{
    freopen("messagew.in","r",stdin);
    freopen("messagew.out","w",stdout);
    n=read(),m=read();
    for(int i=1;i<=m;i++)
      x=read(),y=read(),add(x,y); 
    for(int i=1;i<=n;i++)
     if(!dfn[i]) tarjan(i);
    for(int i=1;i<=n;i++)
     if(ans[belong[i]]>1) printf("T\n");
     else printf("F\n");
    return 0;
}

 

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

标签:stack   接下来   read   getc   消息   tarjan   负责人   问题:   tac   

原文地址:http://www.cnblogs.com/z360/p/7421201.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!