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\n");

66         else

67             printf("F\n");  

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

 

你可能感兴趣的:(code)