1014. Circles of Friends (35)

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值