POJ 4109:公共朋友-Common Friends

】题目:

描述:

小明和小红去参加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

猜你喜欢

转载自blog.csdn.net/qq_34125999/article/details/51444295