codevs 1506 传话
http://codevs.cn/problem/1506/
题目描述 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 }
看了题解,发现有人用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 }
悠游天地间 all rights reserved. © 2013 -- 1 << 64