• 1506 传话 (暴力DFS或者Tarjan模板题)


    题目描述 Description

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

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

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

    输入描述 Input Description

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

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

    输出描述 Output Description

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

     

    样例输入 Sample Input

    4 6

    1 2

    2 3

    4 1

    3 1

    1 3

    2 3

    样例输出 Sample Output

    T

    T

    T

    F

    数据范围及提示 Data Size & Hint

    n<=1000

    1<=a, b<=n

    思路:直接dfs暴力

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    using namespace std;
    const int maxn = 1010;
    vector<int>e[maxn];
    int vis[maxn];
    int dfs(int u, int st)
    {
        vis[u] = 1;            //这样就可以确保每一个点只枚举到一次,因为如果都被枚举到还没找到,那么就没有必要再次
        for (int i = 0; i < e[u].size(); ++i)
        {
            int v = e[u][i];        //枚举与该点连接的点
            if (!vis[v]){ if (dfs(v, st))return 1; }        //这样就不重复
            else if (v == st)return 1;        //找到
        }
        return 0;
    }
    
    int main()
    {
        int n, m, a, b;
        scanf("%d%d", &n, &m);
        for (int i = 0; i < m; ++i)
        {
            scanf("%d%d", &a, &b);
            e[a].push_back(b);
        }
        for (int i = 1; i <= n; ++i)
        {
            memset(vis, 0, sizeof(vis));
            if (dfs(i, i))printf("T
    ");
            else printf("F
    ");
        }
    }
  • 相关阅读:
    SPOJ GSS1 ~ 8解题报告 【完整版】
    题解 UVA1659 【帮助小罗拉 Help Little Laura】
    题解 UVA753 【UNIX插头 A Plug for UNIX】
    题解 P3740 【[HAOI2014]贴海报】
    对拍程序
    dut新生大礼包3
    1240C
    DISCO Presents Discovery Channel Code Contest 2020 Qual 题解
    1254C
    1285E
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10008792.html
Copyright © 2020-2023  润新知