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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n");
    else printf("F\n");
    return 0;
}

 

以上是关于COGS 619. [金陵中学2007] 传话的主要内容,如果未能解决你的问题,请参考以下文章

619. [金陵中学2007] 传话

COGS1752 BOI2007—摩基亚Mokia

cogs 1143. [石门中学2009] 切割树

bzoj1692 cogs2005 jzoj1940: [Usaco2007 Dec]队列变换

2007 Simulation message

cogs 2342. [SCOI2007]kshort