信息技术社团的同学来自各个班级,为了增加友谊,我们在课余时间进行了一个消息转发游戏,如果a认识b,那么a收到某个消息,就会把这个消息传给b,以及所有a认识的人。如果a认识b,b不一定认识a。所有人从1到n编号,给出所有“认识”关系,问如果i号同学发布一条新消息,那么会不会经过若干次转发后,这个消息又传回给了i(1<=i<=n)?

 

输入:

第一行是两个数n(n<1000)和m(m<10000),分别表示人数和认识关系数。接下来的m行,每行两个数a和b,表示a认识b。1<=a和 b<=n。认识关系可能会重复给出,但一行的两个数不会相同。每行的两个数之间有一个空格分隔。

 

输出:

一行共有n个字符(只能是T或F)。第i个字符:如果是T,表示i号同学发出一条新消息会传回给i;如果是F,表示i号同学发出一条新消息不会传回给i。

 

输入示例:

4 6
1 2
2 3
4 1
3 1
1 3
2 3

 

输出示例:

TTTF

 

 

其实这题正解是用DFS,但是我还是用了树……

 

 1 #include<iostream>
 2 using namespace std;
 3 bool ans[10005];
 4 int read()
 5 {
 6     int x=0,f=1;
 7     char ch=getchar();
 8     while(ch<'0'||ch>'9')
 9     {
10         if(ch=='-') f=-1;
11         ch=getchar();
12     }
13     while(ch>='0'&&ch<='9')
14     {
15         x=x*10+ch-'0';
16         ch=getchar();
17     }
18     return x*f;
19 }
20 int main()
21 {
22     int a,b,temp,l=1,flag=1;
23     b=read();a=read();
24     int n[a],m[a];
25     for(int i=0;i<a;i++) {n[i]=read();m[i]=read();}
26     for(int i=0;i<a-1;i++)
27         for(int j=i+1;j<a;j++)
28             if(n[i]>n[j])
29             {
30                 swap(n[i],n[j]);
31                 swap(m[i],m[j]);
32             }
33     while(l<=b)
34     {
35         for(int i=0;i<a;i++) if(n[i]==l) ans[m[i]]=true;
36         for(int i=0;i<a;i++) if(ans[n[i]]==true) ans[m[i]]=true;
37         for(int i=0;i<a;i++) if(ans[n[i]]==true) ans[m[i]]=true;
38         if(ans[l]==true) cout<<"T";
39         else if(ans[l]==false) cout<<"F";
40         memset(ans,0,sizeof(ans));
41         l++;
42     }
43     system("pause>nul");
44     return 0;
45 }