这是浙江省赛的F题,题意是给你n个人,m对朋友关系,如果两个人的公共好友超过k人,那他们可以成为新的朋友,问经过一段“”足够长的时间后“, 新产生了多少对朋友关系这题,发现可以用STL秒, 枚举每对未成为朋友的i和j,如果其公共好友超过k人,那么增加这对关系,然后继续枚举。。。直到不能增加新关系为止
- #include<iostream>
- #include<algorithm>
- #include<string>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- #include<queue>
- #include<stack>
- #include<map>
- #include<set>
- using namespace std;
- map<int, set<int> > f;
- set<int> ::iterator iter;
- int n, m, k, u, v;
- int main()
- {
- int t;
- scanf("%d", &t);
- while(t--)
- {
- f.clear();
- scanf("%d%d%d", &n, &m, &k);
- while(m--)
- {
- scanf("%d%d", &u, &v);
- f[u].insert(v);
- f[v].insert(u);
- }
- bool flag = 1;
- int ans = 0;
- while(flag)
- {
- flag = 0;
- for(int i=0; i<n-1; i++)
- for(int j=i+1; j<n; j++)
- {
- if(f[i].count(j)) continue;
- int cnt = 0;
- for(iter = f[i].begin(); iter != f[i].end(); iter++)
- {
- int m = *iter;
- if(f[j].count(m)) cnt++;
- }
- if(cnt >= k)
- {
- ans++;
- f[i].insert(j);
- f[j].insert(i);
- flag = 1;
- }
- }
- }
- printf("%d\n", ans);
- }
- return 0;
- }