解题思路:
将输入的关系放入邻接矩阵中,有关系则用1表示,将两个邻接矩阵相乘,矩阵中的值表示对应的guest1到guest2的路径数,1表示只有一条路径,2表示有两条路径,其中的路径数就是题目中的common friends 数。
源代码:
// partyFriends.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
void main()
{
int id;
int len;
int guest_num;
int i,j,k;
scanf("%d",&id);
scanf("%d",&len);
scanf("%d",&guest_num);
int **relation;
relation = (int **)malloc(sizeof(int*)*guest_num);
for(i = 0;i < guest_num;i++)
{
relation[i] = (int *)malloc(sizeof(int)*guest_num);
memset(relation[i], 0, sizeof(int)*guest_num);
}
int **result;
result = (int **)malloc(sizeof(int*)*guest_num);
for(i = 0;i < guest_num;i++)
{
result[i] = (int *)malloc(sizeof(int)*guest_num);
memset(result[i], 0, sizeof(int)*guest_num);
}
char c;
int guest_id, num;
getchar();//去掉之前的换行符
for(i = 0;i < guest_num;i++)
{
j = 0;
while((c = getchar())!='\n')
{
if(c == ' ')
{
continue;
}
num = atoi(&c) -1;
if(j == 0)
{
guest_id = num;
j++;
}
else{
relation[guest_id][num] = 1;
}
}
}
for(i = 0; i < guest_num; i++)
{
for(j = 0; j < guest_num; j++)
{
for(k = 0;k < guest_num; k++)
{
result[i][j] += relation[i][k]*relation[k][j];
}
}
}
for(i = 0; i < guest_num; i++)
{
if(result[id-1][i] == len && i != id-1)
{
printf("%d ",i+1);
}
}
for(i = 0; i < guest_num; i++)
{
free(relation[i]);
free(result[i]);
}
free(relation);
free(result);
while(true);
}