zoj 3710 Friends

这题意思是有n个人,其中有m对朋友关系,其中不认识的两个人要成为朋友的条件是他们有至少k个共同的朋友,问最后能有多少对新朋友。
这题可以用图论解决,使用矩阵储存两个人之间的关系(1表示朋友关系,0表示不认识),然后遍历整个矩阵,寻找不认识的人的共同朋友,
并判断他们是否能成为新朋友,若能,则关系改为1,再重新遍历矩阵。
例如第一组样例可表示为;


| 0 1 2 3
-|--------
0| 0 1 1 0
1| 1 0 0 1
2| 1 0 0 1
3| 0 1 1 0

 

#include"stdio.h"
#include"string.h"
int main()
{
 int m,aa,bb,n,i,j,k,h,t;
 int a[100][100];
 scanf("%d",&t);
 while(t--)
 {
  scanf("%d%d%d",&n,&m,&k);
  memset(a,0,sizeof(a));
  for(i=0;i<m;i++)
  {
   scanf("%d%d",&aa,&bb);
   a[aa][bb]=1;
   a[bb][aa]=1;
  }
  int sum1=0,sum2=0;
  while(1)
  {
   int s=0;
   for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {
     if(i!=j&&a[i][j]==0)
     {
      sum2=0;
      for(h=0;h<n;h++)
      {
       if(a[i][h]&&a[j][h])
        sum2++;
      }
      if(sum2>=k)
      {
       a[i][j]=1;
       a[j][i]=1;
       s++;
      }
     }
    }
    sum1+=s;
    if(s==0)
     break;
  }
  printf("%d\n",sum1);
 }
 return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值