】题目:
描述:
小明和小红去参加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个人有多少公共的朋友。样例输入:
2 3 2 2 1 2 2 3 1 3
#include "iostream"
#include "vector"
#include "algorithm"
#include "string.h"
using namespace std;
#define Max 102
#define Sky 1<<29
#define MAX(a,b) ( a > b ? a : b )
int Top,Edge,N;
int Map[Max][Max];
void F(int x,int y)
{
vector<int> T1;
vector<int> T2;
T1.clear();
T2.clear();
int i;
for(i=1;i<=Top;i++)
{
if(Map[x][i]!=Sky && x!=y)
{
T1.push_back(i);
}
if(Map[y][i]!=Sky && x!=y)
{
T2.push_back(i);
}
}
int num=0;
for(i=0;i<T1.size();i++)
{
if(count(T2.begin(),T2.end(),T1[i])!=0)
num++;
}
cout<<num<<endl;
}
int main()
{
//freopen("1.txt","r",stdin);
int X;
cin>>X;
for(int t=1;t<=X;t++)
{
cin>>Top>>Edge>>N;
int i,j;
for(i=1;i<=Top;i++)
for(j=1;j<=Top;j++)
{
Map[i][j]=Sky;
}
for(i=1;i<=Edge;i++)
{
int x,y;
cin>>x>>y;
Map[x][y]=Map[y][x]=1;
}
cout<<"Case "<<t<<":"<<endl;
for(i=1;i<=N;i++)
{
int x,y;
cin>>x>>y;
F(x,y);
}
}
return 0;
}
5 5 21 21 32 53 54 51 53 4
样例输出:
Case 1: 1 0 Case 2: 2 1