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
原文地址:https://www.cnblogs.com/jeff-wgc/p/4452785.html