HDU-1869 六度分离题解
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869
专题链接:https://vjudge.net/contest/351234#problem/C
思路
先将整个数组初始化为无限大,如果两个人相互认识,就将对应的位置改为0(即直接认识),再按照floyd算法,如果两个人能通过其他人认识,数字便变为间隔人数。
AC代码如下
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int arr[101][101];
int N, M;
int i, j;
int inf=1000000000;
int main ()
{
while (cin >> N >> M)
{
for (i = 0; i <= N-1; i++)
{
for (j = 0; j <= N-1; j++)
arr[i][j] = inf; //初始化
}
while (M--)
{
scanf("%d%d", &i, &j);//输入部分,记得认识是相互的,所以两个位置都要改
arr[i][j] = 0;
arr[j][i] = 0;
}
for(int k=0;k<=N-1;k++)
{
for (i = 0; i <= N-1; i++)
{
for (j = 0; j <= N-1; j++)
{
if (i == j)
continue;
if (arr[i][j] > arr[i][k] + arr[k][j] + 1)//核心部分
arr[i][j] = arr[i][k] + arr[k][j] + 1
}
}
}
for (i = 0; i <= N-1; i++)
{
for (j = 0; j <= N - 1; j++)
{
if (i == j)
continue;
if (arr[i][j] > 6)//进行题目要求的判定
{
arr[i][i] = 0;
break;
}
}
}
bool pan = 1;
for (i = 0; i <= N - 1; i++)
{
if (arr[i][i] == 0)
{
printf("No\n");
pan = 0;
break;
}
}
if (pan)
printf("Yes\n");
}
return 0;
}