这是浙江省赛的F题,题意是给你n个人,m对朋友关系,如果两个人的公共好友超过k人,那他们可以成为新的朋友,问经过一段“”足够长的时间后“, 新产生了多少对朋友关系?刚开始看到这个题觉得很难。。。尤其是那个“a sufficiently long time”,不知到如可搞。。。于是先做了其他水题,再一看这题,发现可以用STL秒, 枚举每对未成为朋友的i和j,如果其公共好友超过k人,那么增加这对关系,然后继续枚举。。。直到不能增加新关系为止。。。十分钟敲完1Y ~
#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;
}