信息技术社团的同学来自各个班级,为了增加友谊,我们在课余时间进行了一个消息转发游戏,如果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 }
时间: 2024-10-05 04:41:00