• codevs 1506 传话


    http://codevs.cn/problem/1506/

    1506 传话

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 白银 Silver
     
     
     
    题目描述 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

    分析:

    广搜,因为如果搜索到某层K,如果不是由i层转回到i层的一条回路,而是一条死路,那么以后必然也不用搜索这层了。

    AC代码:

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <string.h>
     5 #include <string>
     6 #include <math.h>
     7 #include <stdlib.h>
     8 #include <queue>
     9 #include <stack>
    10 #include <set>
    11 #include <map>
    12 #include <list>
    13 #include <iomanip>
    14 #include <vector>
    15 #pragma comment(linker, "/STACK:1024000000,1024000000")
    16 #pragma warning(disable:4786)
    17 
    18 using namespace std;
    19 
    20 const int INF = 0x3f3f3f3f;
    21 const int MAX = 1e3 + 10;
    22 const double eps = 1e-8;
    23 const double PI = acos(-1.0);
    24 
    25 bool f[MAX][MAX];
    26 bool mark[MAX];
    27 int n,m,a,b,flag,i;
    28 
    29 void bfs(int start)
    30 {
    31     queue<int >q;
    32     int p;
    33     q.push(start);
    34     while(!q.empty())
    35     {
    36         int temp=q.front();  q.pop();
    37         for(p=1;p<=n;p++)
    38         {
    39             if(f[temp][p]&&!mark[p])
    40             {
    41                 mark[p]=1;
    42                 q.push(p);
    43             }
    44             if(mark[i])
    45             {
    46                 flag=1;
    47                 return ;
    48             }
    49         }
    50     }
    51 }
    52 
    53 int main()
    54 {
    55     cin>>n>>m;
    56     
    57     memset(f,0,sizeof(f));
    58     for(i=0;i<m;i++) scanf("%d%d",&a,&b), f[a][b]=1;
    59     
    60     for(i=1;i<=n;i++)
    61     { 
    62         memset(mark,0,sizeof(mark));  flag=0;
    63         bfs(i);
    64         if(flag)
    65             printf("T
    ");
    66         else
    67             printf("F
    ");  
    68     }
    69     return 0;
    70 }
    View Code

    看了题解,发现有人用Floyd ,主要是数据量小,orz

    AC代码:

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 int f[1001][1001];
     5 int n,m,x,y;
     6 using namespace std;
     7 int main()
     8 {
     9      scanf("%d%d",&n,&m);
    10      memset(f , 0 , sizeof(f));
    11         for(int i = 1;i <= m;++ i){
    12          scanf("%d%d",&x,&y);
    13          f[x][y] = 1;
    14      }
    15      for(int k = 1;k <= n;++ k)
    16          for(int i = 1;i <= n;++ i)
    17              for(int j = 1;j <= n;++ j)
    18                   if(f[i][k] == 1 && f[k][j] == 1)
    19                         f[i][j] = 1;
    20      for(int i = 1;i <= n;++ i)
    21          if(f[i][i] == 1)
    22               cout<<"T"<<endl;
    23           else
    24               cout<<"F"<<endl;
    25      return 0;
    26 }
    View Code
  • 相关阅读:
    EasyARM-iMX283A的Linux 开发环境构建
    linux指令tar笔记
    使用cuteFTP与虚拟机交互文件---安装ftp服务
    SecureCRT显示乱码的解决办法
    【转】简明 Vim 练级攻略
    图像识别___YUV学习手记
    一个简易的软件定时器
    OV7670配置和调试小结
    linux驱动开发( 五) 字符设备驱动框架的填充file_operations结构体中的操作函数(read write llseek unlocked_ioctl)
    hash-1.hash表和hash算法
  • 原文地址:https://www.cnblogs.com/jeff-wgc/p/4452785.html
Copyright © 2020-2023  润新知