• COGS 619. [金陵中学2007] 传话


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

    [问题描述]

    兴趣小组的同学来自各个学校,为了增加友谊,晚会上又进行了一个传话游戏,如果 a 认识 b ,那么 a 收到某个消息,就会把这个消息传给 b ,以及所有 a 认识的人。

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

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

    [输入文件]

    输入文件 message.in 中的第一行是两个数 n(n<1000) 和 m(m<10000) ,两数之间有一个空格,表示人数和认识关系数。

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

    [输出文件]

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

    [输入样例]

    4 6
    1 2 
    2 3 
    4 1 
    3 1 
    1 3 
    2 3

    [输出样例]




    F

    tarjan 模板题

    屠龙宝刀点击就送

    #include <ctype.h>
    #include <cstdio>
    #define N 2000
    
    struct node
    {
        int next,to;
        node (int next=0,int to=0):
         next(next),to(to){}
    }edge[N<<1];
    int min(int a,int b)
    {
        return a>b?b:a;
    }
    int ok[N],col[N],sumcol,n,cnt,m,head[N<<1],dfn[N],stack[N],top,tm,low[N];
    bool vis[N],instack[N];
    void read(int &x)
    {
        x=0;bool f=0;
        char ch=getchar();
        while(!isdigit(ch))
        {
            if(ch=='-') f=1;
            ch=getchar();
        }
        while(isdigit(ch))
        {
            x=x*10+ch-'0';
            ch=getchar();
        }
        x=f?(~x)+1:x;
    }
    void add(int x,int y)
    {
        edge[++cnt]=node(head[x],y);
        head[x]=cnt;
    }
    void dfs(int now)
    {
        dfn[now]=low[now]=++tm;
        instack[now]=1;
        stack[++top]=now;
        vis[now]=1;
        for(int i=head[now];i;i=edge[i].next)
        {
            int v=edge[i].to;
            if(instack[v]) low[now]=min(low[now],dfn[v]);
            else if(!vis[v])
            {
                dfs(v);
                low[now]=min(low[now],low[v]);
            }
        }
        if(low[now]==dfn[now])
        {
            sumcol++;
            int tot=0,k=0;
            do
            {
                tot++;
                k=stack[top--];
                ok[k]=1;
                instack[k]=0;
                col[k]=sumcol;
            }while(k!=now);
            if(tot==1) ok[k]=0;
        }
    }
    int main()
    {
        freopen("messagez.in","r",stdin);
        freopen("messagez.out","w",stdout);
        read(n);read(m);
        for(int x,y;m--;)
        {
            read(x);read(y);
            add(x,y);
        }
        for(int i=1;i<=n;i++) 
        if(!vis[i]) dfs(i);
        for(int i=1;i<=n;i++)
        if(ok[i]) printf("T
    ");
        else printf("F
    ");
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    hdu 1873 看病要排队
    母函数详解
    【RDMA】无损网络和PFC(基于优先级的流量控制)
    图解Linux网络包接收过程
    结对编程 <==> 断背山?
    CMPP和SMPP协议比较
    Berkerly DB、SQL Server的性能比较
    使用Berkeley DB遇到问题了
    重新学习C语言
    超长短信的处理办法
  • 原文地址:https://www.cnblogs.com/ruojisun/p/6789472.html
Copyright © 2020-2023  润新知