枚举中间的边,然后把(b的朋友数-1)*(c的朋友数-1)加到答案中。
(最后注意乘二,因为颠倒顺序又能出来一组)
#include<stdio.h>
#include<string.h>
#include<cstring>
#define ll long long
using namespace std;
int a[100010],b[100010];ll ea[100010],eb[100010];
int main()
{
int t;int n,m,k;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof a);
memset(b,0,sizeof b);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
{
scanf("%d%d",&ea[i],&eb[i]);
a[ea[i]]++;
b[eb[i]]++;
}
ll sum=0;
for(int i=1;i<=k;i++)
{
sum+=(a[ea[i]]-1)*(b[eb[i]]-1);
}
printf("%lld\n",sum*2);
}
}
本文介绍了一种使用枚举法解决社交网络中友谊链接数量问题的算法。通过遍历每条边,计算其两端节点各自的朋友数量(减去自身),并将其乘积累加至总和,最后将总和乘以二得到最终答案,以考虑到链接方向的双重计数。
584

被折叠的 条评论
为什么被折叠?



