题:
-
总时间限制: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;
}