zoukankan      html  css  js  c++  java
  • cojs 1001. [WZOI2011 S3] 消息传递

    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

    AC代码:

    #include<cstdio>
    #include<vector>
    #include<stack>
    using namespace std;
    #define N 100010
    int n,m,sd,pd,id[N],sum[N],low[N],dfn[N];
    bool mark[N];
    stack<int>s;
    vector<int>grap[N];
    void tarjan(int v){
        low[v]=dfn[v]=++pd;
        mark[v]=1;
        s.push(v);
        for(int i=0;i<grap[v].size();i++){
            int w=grap[v][i];
            if(!dfn[w]){
                tarjan(w);
                low[v]=min(low[v],low[w]);
            }
            else if(mark[w]){
                low[v]=min(low[v],dfn[w]);
            }
        }
        int u;
        if(low[v]==dfn[v]){
            sd++;
            do{
                u=s.top();
                s.pop();
                id[u]=sd;
                sum[sd]++;
                mark[u]=0;
            }while(u!=v);
        }
    }
    int main(){
        freopen("messagew.in","r",stdin);
        freopen("messagew.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1,x,y;i<=m;i++) scanf("%d%d",&x,&y),grap[x].push_back(y);
        for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
        for(int i=1;i<=n;i++) puts(sum[id[i]]>1?"T":"F");
        return 0;
    }
  • 相关阅读:
    .Net中的设计模式——Decorator模式
    PetShop的系统架构设计
    PetShop数据访问层之消息处理
    对象的封装与C#的类
    Flash/Flex学习笔记(46):正向运动学
    Flash/Flex学习笔记(43):动量守恒与能量守恒
    win7下恢复“经典任务栏”/“快速启动栏”,关闭“窗口自动最大化”
    Flash/Flex学习笔记(50):3D线条与填充
    图片的javascript延时加载
    Flash/Flex学习笔记(51):3维旋转与透视变换(PerspectiveProjection)
  • 原文地址:https://www.cnblogs.com/shenben/p/5838723.html
Copyright © 2011-2022 走看看