ZOJ 3710 Friends(暴力或map)

来源:互联网 发布:php 直播间 编辑:程序博客网 时间:2024/05/18 11:49

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

题意:给你n个人,m对朋友关系,如果两个人的公共好友超过k人,那他们可以成为新的朋友,问经过一段“”足够长的时间后“, 新产生了多少对朋友关系?

思路:题目数据量较小,可以直接暴力,也可以用下stl


#include <cstdio>#include <cmath>#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <stdlib.h>#include <stack>#include <queue>#include <ctype.h>#include <set>#include <map>#include <iterator>using namespace std;int a[200][200];int main(){    int t;    scanf("%d", &t);    while(t--)    {        memset(a, 0, sizeof(a));        int n, m, k;        cin >> n >> m >> k;        int i, j;        for(i = 0; i < m; i++)        {            int u, v;            scanf("%d%d", &u, &v);            a[u][v] = a[v][u] = 1;        }        int  num, sum = 0;        int flag = 1;        while(flag)        {            flag = 0;            for(i = 0; i < n; i++)            for(j = i + 1; j < n; j++)            {                if(a[i][j] == 1)                    continue;                num = 0;                for(int l = 0; l < n; l++)                {                    if(a[i][l] == a[j][l] && a[i][l] == 1)                        num++;                }                if(num >= k)                {                    a[i][j] = a[j][i] = 1;                    sum++;                    flag = 1;                }            }        }        cout << sum << endl;    }    return 0;}


#include <cstdio>#include <cmath>#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <stdlib.h>#include <stack>#include <queue>#include <ctype.h>#include <set>#include <map>#include <iterator>using namespace std;int main(){    int t;    scanf("%d", &t);    while(t--)    {        map <int, set<int> > fr;        set <int> ::iterator it;        int n, m, k;        cin >> n >> m >> k;        while(m--)        {            int u, v;            scanf("%d%d",&u,&v);            fr[u].insert(v);            fr[v].insert(u);        }        int  num, sum = 0;        int flag = 1;        while(flag)        {               flag = 0;            for(int i = 0; i < n; i++)            for(int j = i + 1; j < n; j++)            {                if(fr[i].count(j))                    continue;                num = 0;                for(it = fr[i].begin(); it != fr[i].end(); it++)                {                    if(fr[j].count(*(it)))                        num++;                }                if(num >= k)                {                    sum++;                    fr[i].insert(j);                    fr[j].insert(i);                    flag = 1;                }            }        }        cout << sum << endl;    }    return 0;}


0 0