刷过一题之消息转发
信息技術社團的同學來自各個班級,為了增加友誼,我們在課余時間進行了一個消息轉發游戲,如果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 }?
轉載于:https://www.cnblogs.com/nightfury/p/5040888.html
總結
- 上一篇: Android开发-mac上使用三星S3
- 下一篇: Eclipse svn代码提交冲突