1.题面
2.题意
问一张图中有几个独立的联通块,以及所有中距离最大的两个点的距离。3.思路
因为问题规模很小,所以可以对每个点进行一次BFS,看到网上有用并查集的,其实用不着
我在这里犯的一个很大的错是强行把邻接矩阵转换成邻接表,但事实上这张图的边可以很多
4.代码
/*****************************************************************
> File Name: cpp_acm.cpp
> Author: Uncle_Sugar
> Mail: uncle_sugar@qq.com
> Created Time: Tue 21 Feb 2017 00:58:12 CST
*****************************************************************/
# include <cstdio>
# include <cstring>
# include <cctype>
# include <cmath>
# include <cstdlib>
# include <climits>
# include <iostream>
# include <iomanip>
# include <set>
# include <map>
# include <vector>
# include <stack>
# include <queue>
# include <algorithm>
using namespace std;
# define rep(i,a,b) for (i=a;i<=b;i++)
# define rrep(i,a,b) for (i=b;i>=a;i--)
# define mset(aim, val) memset(aim, val, sizeof(aim))
struct QuickIO{
QuickIO(){const int SZ = 1<<20;
setvbuf(stdin ,new char[SZ],_IOFBF,SZ);
setvbuf(stdout,new char[SZ],_IOFBF,SZ);
} //*From programcaicai*//
}QIO;
template<class T>void PrintArray(T* first,T* last,char delim=' '){
for (;first!=last;first++) cout << *first << (first+1==last?'\n':delim);
}
/*
1.see the size of the input data before you select your algorithm
2.cin&cout is not recommended in ACM/ICPC
3.pay attention to the size you defined, for instance the size of edge is double the size of vertex
*/
const int debug = 1;
const int size = 10 + 1000;
const int INF = INT_MAX>>1;
typedef long long ll;
int g[size][size];
int level[size];
int n;
int que[size], head, tail;
int bfs(int u){
head = tail = 0;
level[u] = 0;
que[tail++] = u;
int ret = 0;
while (head < tail){
int t = que[head++];
for (int i = 0; i < n; i++){
if (g[t][i]){
int v = i;
if (level[v] == -1){
que[tail++] = v;
level[v] = level[t] + 1;
ret = max(ret, level[v]);
}
}
}
}
return ret;
}
int r[size];
int main(){
// std::ios::sync_with_stdio(false);cin.tie(0);
scanf("%d", &n);
for (int i = 0; i < n; i++){
int k;
scanf("%d", &k);
while (k--){
int tmp;scanf("%d", &tmp);--tmp;
g[i][tmp] = g[tmp][i] = 1;
}
// for (int i = 0; i < n; i++){
// for (int j = i+1; j < n; j++){
// if (g[i][j]){
// gg[i].push_back(j);
// gg[j].push_back(i);
// }
// }
// }
}
int cnt = 0, ma = 0;
memset(level, -1, sizeof(level));
for (int i = 0; i < n; i++){
if (level[i] == -1){
ma = max(ma, bfs(i)-1);
r[i] = 1;
cnt++;
}
}
for (int i = 0; i < n; i++){
if (r[i]) continue;
memset(level, -1, sizeof(level));
ma = max(ma, bfs(i)-1);
}
printf("%d %d\n", cnt, ma);
return 0;
}