OpenJudge百炼习题解答(C++)--题4109:公共朋友-Common Friends

题:

总时间限制:1000ms       内存限制:65536kB
描述

小明和小红去参加party。会场中总共有n个人,这些人中有的是朋友关系,有的则相互不认识。朋友关系是相互的,即如果A是B的朋友,那么B也是A的朋友。小明和小红想知道其中某两个人有多少个公共的朋友。


输入
第一行为一个正整数c,代表测试数据的个数。接下来是c组测试数据。

对于每组测试数据,第一行是三个数字n(2<=n<=100),m和k,分别表示会场中的人数,已知的朋友关系数目,问题的数目。接下来的m行,每行用两个数字i和j(1<=i,j<=n)表示了一个朋友关系,表示第i个人和第j个人是朋友关系。接下来的k行,每行用两个数字i和j(1<=i,j<=n)表示一个问题,请问第i个人和第j个人有多少公共的朋友。
输出
对于第i组测试数据,首先输出一行”Case i:”,接下来得k行代表了k个问题,每行输出第i个人和第j个人有多少公共的朋友。
样例输入:

样例输出:             

解:

#include<stdio.h>
int FindCommonF(int K1,int K2,int ia[100][101],int ja[100][101],int Nu,int c);
int main()
{
	int C;
int n;


	scanf("%d",&C);
	int k[C];
	int m[C];
	int i[100][101];
	int j[100][101];
	
	int InputK1[C][101];
	int InputK2[C][101];
	for(int hh=0;hh<C;hh++)
	{
		for(int uu=0;uu<101;uu++)
		{
			j[hh][uu]=0;
			i[hh][uu]=0;
			InputK1[hh][uu]=0;
			InputK2[hh][uu]=0;
		}
	}
	
	
	
	for(int a=0;a<C;a++)
	{
	       scanf("%d %d %d",&n,&m[a],&k[a]);
	       int ii=0;
	for(ii=0;ii<m[a];ii++)
	{
		scanf("%d %d",&i[a][ii],&j[a][ii]);
		
	}
	
	
	
	int jj=0;
	for( jj=0;jj<k[a];jj++)
	{
		scanf("%d %d",&InputK1[a][jj],&InputK2[a][jj]);
		
	}
		
	}
	
	for(int b=0;b<C;b++)
	{
		printf("Case %d:\n",b+1);
		
		for(int kk=0;kk<k[b];kk++)
		{
			printf("%d\n",FindCommonF(InputK1[b][kk],InputK2[b][kk],i,j,m[b],b));
		}
		
		
		
		
	}

	
	
	
	return 0;
}
int FindCommonF(int K1,int K2,int ia[100][101],int ja[100][101],int Nu,int c)
{
	int C1=0;
	int C2=0;
	int Count=0;
		int CoF1[101];
	int CoF2[101];
	for(int q=0;q<101;q++){
		CoF1[q]=0;
		CoF2[q]=0;
	}
	for(int i=0;i<Nu;i++)
	{
		if(ia[c][i]==K1&&ja[c][i]!=0)
		{
			CoF1[C1]=ja[c][i];
			C1++;
		}
		if(ja[c][i]==K1&&ia[c][i]!=0)
		{
			CoF1[C1]=ia[c][i];
			C1++;
		}
		if (ia[c][i]==K2&&ja[c][i]!=0)
		{
			CoF2[C2]=ja[c][i];
			C2++;
		}
		if(ja[c][i]==K2&&ia[c][i]!=0)
		{
			CoF2[C2]=ia[c][i];
			C2++;
		}
		
		
	 } 
	 
	 for(int n=0;n<C1;n++)
	 {
	 	for(int k=0;k<C2;k++)
	 	{
	 		if(CoF1[n]==CoF2[k])
	 		{
	 			Count++;
			 }
		 }
	 }
	return Count;
	}

推荐文章:那些年,做的几个应用


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值