1.题面
2.题意
问一张图中有几个独立的联通块,以及所有中距离最大的两个点的距离。3.思路
因为问题规模很小,所以可以对每个点进行一次BFS,看到网上有用并查集的,其实用不着
我在这里犯的一个很大的错是强行把邻接矩阵转换成邻接表,但事实上这张图的边可以很多
4.代码
/***************************************************************** > File Name: cpp_acm.cpp > Author: Uncle_Sugar > Mail: [email protected] > 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; }