zoukankan      html  css  js  c++  java
  • [ZOJ 3710] Friends

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3710

    说下思路:
    用vector记录每个人所结交的朋友,利用set的特性(不能存在重复元素)筛选出不是两个人共同的朋友的数量,然后 x结交的朋友的数量 + y结交的朋友的数量 - x与y非共同朋友的数量 得出一个值(x与y共同朋友的数量),然后和k进行比较,大于k说明两人可以在以后成为朋友。要注意,当x与y成为新的朋友后,原先的关系会改变,需要从头再遍历一遍,如此循环往复,直到没有朋友可交为止。

    AC代码:

    #include <cstdio>
    #include <set>
    #include <vector>
    #include <cstring>
    
    using namespace std;
    
    const int maxn = 110;
    
    vector<int> v[maxn];
    set<int> s;
    bool vis[maxn][maxn];
    
    int test;
    int n, m, k;
    int x, y;
    
    bool judge(int x, int y) {
        s.clear();
        for(int i = 0; i < v[x].size(); i++) {
            s.insert(v[x][i]);
        }
        for(int i = 0; i < v[y].size(); i++) {
            s.insert(v[y][i]);
        }
        int temp = v[x].size() + v[y].size() - s.size();
        if(temp >= k)
            return true;
        return false;
    }
    
    void init() {
        memset(vis, false, sizeof(vis));
        //清空要清空所有分配的内存,也就是要到maxn,不然可能会导致段错误(Segmentation Fault)
        for(int i = 0; i < maxn; i++) {
            vis[i][i] = true;
            v[i].clear();
        }
    }
    
    int main() {
        scanf("%d", &test);
        while(test--) {
            init();
            scanf("%d%d%d", &n, &m, &k);
            for(int i = 0; i < m; i++) {
                scanf("%d%d", &x, &y);
                v[x].push_back(y);
                v[y].push_back(x);
                vis[x][y] = vis[y][x] = true;
            }
            bool flag = true;
            int cnt = 0;
            while(flag) {
                flag = false;
                for(int i = 0; i < n; i++) {
                    for(int j = i + 1; j < n; j++) {
                        if(!vis[i][j]) {
                            if(judge(i, j)) {
                                flag = true;
                                vis[i][j] = vis[j][i] = true;
                                v[i].push_back(j);
                                v[j].push_back(i);
                                cnt++;
                            }
                        }
                    }
                }
            }
            printf("%d
    ", cnt);
        }
        return 0;
    }
    
    
  • 相关阅读:
    VMware 创建的虚拟机,Xshell无法进行连接
    Centos7 文件修改详情
    Centos7 selinux关闭
    centos7 RPM命令使用
    centos 操作系统优化
    centos 内存使用情况+负载使用情况
    Centos 修改环境变量
    centos7 系统级别(持续更新)
    centos7 常规修改信息(比较杂的)持续更新
    centos7 修改网卡信息
  • 原文地址:https://www.cnblogs.com/youpeng/p/10802407.html
Copyright © 2011-2022 走看看