UVA 10608 Friends
题目大意:共有n个人,m对人为已知的朋友关系,而且这种关系具有传递性,也就是A与B,B与C是朋友,可以确定A与C是朋友,求一个人数最多的朋友团体。
bfs就可以了,遇到未访问的结点,加入队列并且朋人数增加,bfs一开始只访问未访问的结点,并作为一个团体的开始。、
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <climits> 4 #include <cstring> 5 #include <cstdlib> 6 #include <cmath> 7 #include <vector> 8 #include <queue> 9 #include <algorithm> 10 #define esp 1e-6 11 #define pb push_back 12 #define in freopen("in.txt", "r", stdin); 13 #define out freopen("out.txt", "w", stdout); 14 #define print(a) printf("%d\n",(a)); 15 #define bug puts("********))))))"); 16 #define Rep(i, c) for(__typeof(c.end()) i = c.begin(); i != c.end(); i++) 17 #define inf LLONG_MAX 18 #define INF 0x0f0f0f0f0f0f 19 using namespace std; 20 typedef long long LL; 21 typedef vector<int> VI; 22 typedef vector<int>:: iterator IT; 23 #define N 30010 24 #define M 501000 25 VI g[N], ss; 26 int vis[N], ans, temp; 27 void init(void) 28 { 29 ans = 0; 30 memset(vis, 0, sizeof(vis)); 31 } 32 void bfs(int u) 33 { 34 temp = 1; 35 vis[u] = 1; 36 queue<int> q; 37 q.push(u); 38 while(!q.empty()) 39 { 40 int i; 41 i = q.front(); 42 q.pop(); 43 Rep(k, g[i]) 44 { 45 if(!vis[*k]) 46 vis[*k] = 1,temp++, q.push(*k); 47 } 48 49 } 50 } 51 int main(void) 52 { 53 int T; 54 for(int t = scanf("%d", &T); t <= T ; t++) 55 { 56 for(int i = 0; i < N; i++) 57 g[i].clear(); 58 ss.clear(); 59 init(); 60 int n, m; 61 scanf("%d%d", &n, &m); 62 while(m--) 63 { 64 int u, v; 65 scanf("%d%d", &u, &v); 66 g[u].pb(v); 67 g[v].pb(u); 68 ss.pb(u),ss.pb(v); 69 } 70 Rep(i, ss) 71 { 72 temp = 0; 73 if(!vis[*i]) 74 bfs(*i); 75 ans = max(temp, ans); 76 } 77 printf("%d\n", ans); 78 } 79 return 0; 80 }