• 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
    ");
        }
    }
  • 相关阅读:
    mysql连接数过多 解决方案
    单列模式下的数据库连接与Servlet之间页面访问用户登录的小例子
    Spring MVC理解和主要使用的注解详解
    Spring JDBC 框架中, 绑定 SQL 参数的另一种选择:具名参数(named parameter)
    xlwings
    openpyxl
    【python】Excel两表中某个信息对比
    pycharm中配置python版本问题
    python指令提示不是内部或外部命令(环境变量配置)
    python管理电脑文件及文件夹
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10008792.html
Copyright © 2020-2023  润新知