• 传话


    【题目描述】

    一个朋友网络,如果a认识b,那么如果a第一次收到某个消息,那么会把这个消息传给b,以及所有a认识的人。如果a认识b,b不一定认识a。

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

    【输入描述】

    第一行是n和m,表示人数和认识关系数;

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

    【输出描述】

    一共n行,每行一个字符T或F。第i行如果是T,表示i发出一条新消息会传回给i,如果是F,表示i发出一条新消息不会传回给i。

    【样例输入】

    4 6

    1 2

    2 3

    4 1

    3 1

    1 3

    2 3

    【样例输出】

    T

    T

    T

    F

    【数据范围及提示】

    n<=1000。

    源代码:
    
    #include<cstdio>
    #include<cstring>
    int i[1001][10001];
    int n,m,T;
    bool Vis[1001],f[1001];
    void DFS(int t)
    {
        if (f[T]) //找到了就返回。
          return;
        Vis[t]=true;
        if (t==T) //重合即为环。
        {
            f[T]=true;
            return;
        }
        for (int a=1;a<=i[t][0];a++)
          if (!Vis[i[t][a]]) //未找过。
            DFS(i[t][a]);
    }
    int main() //普通DFS。
    {
        scanf("%d%d",&n,&m);
        for (int a=1;a<=m;a++)
        {
            int t1,t2;
            scanf("%d%d",&t1,&t2);
            i[t1][0]++; //节省空间,邻接点数量。
            i[t1][i[t1][0]]=t2;
        }
        for (T=1;T<=n;T++)
        {
            memset(Vis,false,sizeof(Vis));
            for (int a=1;a<=i[T][0];a++)
              DFS(i[T][a]); //DFS每条边。
        }
        for (int a=1;a<=n;a++)
          if (f[a])
            printf("T
    ");
          else
            printf("F
    ");
        return 0;
    }
  • 相关阅读:
    linux commands ---2 ,学习vim编辑器如何使用的方法。
    $stateParams 详解
    ipa 打包遇到的坑
    原生和jQuery的ajax用法
    ios 的 desciption
    ios上线流程
    android 上线流程
    cordova 常用插件
    iframe
    cordova 强制竖屏
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5402203.html
Copyright © 2020-2023  润新知