XOJ:http://acm.xmu.edu.cn/problem.php?id=1078
人肉搜索与刺青、美白、护肤、减肥等直接在人肉上施行的种种行为无关。顾名思义,人肉搜索就是利用现代信息科技,变传统的网络信息搜索为人找人,人问人,人碰人,人挤人、人挨人的关系型网络社区活动,变枯燥乏味的查询过程为一人提问、八方回应,一石激起千层浪,一声呼唤惊醒万颗真心的人性化搜索体验。人肉搜索不仅可以在最短时间内揭露某某门背后的真相,为某三某七找到大众认可的道德定位,还可以在网络无法触及的地方,探寻并发现最美丽的丛林少女,最感人的高山牧民,最神秘的荒漠洞窟,最浪漫的终极邂逅…… 人肉搜索追求的最高目标是:不求最好,但求最肉。
--谷歌四月一日的愚人节笑话
人肉搜索之所以强大,其原因在于世界上任何两个人,要么他们是朋友,要么他们是朋友的朋友,要么他们是朋友的朋友的朋友,要么他们是朋友的朋友的朋友的朋友,要么他们是朋友的朋友的朋友的朋友的朋友。。。人肉搜索引擎正是利用了这一点,对于每个问题,人肉搜索开始M层的搜索,第一层是搜索我的朋友,第二层是搜索我朋友的朋友,第三层是使搜索我朋友的朋友的朋友。。。给一个人际关系表,问M至少要为多少才能保证所有人之间可以通过人肉搜索引擎搜索到。
输入的第一行包含一个正整数N(2 <= N <= 100),表示总的人数。
输入的第二行到第N+1行每行有N个整数,第i行第j列的数字Fij如果为1表示第i个人和第j个人是朋友,否则不是。保证Fij = Fji,Fii = 1。
输出这N个人中,保证人肉搜索引擎的正常工作(即所有人都能被搜索到)前提下,M的最小值。如果存在两个人他们不是朋友的朋友的朋友的。。。的朋友,则输出-1。
4
1 0 1 1
0 1 0 1
1 0 1 0
1 1 0 1
2
样例中,1和3是朋友,1和4是朋友,2和4是朋友。此时2和3之间间隔了1、4两个人的关系,所以结果为2。
#include<stdio.h>
#define MAX 10002
int isUnion[100];
int w[100][100];
int d[100], path[100];
void shortestPath(int p[][100], int n, int d[], int path[], int s)
{
for (int i = 0; i<n; ++i)
if (p[s][i] != MAX)
break;
else if (i == n)
return;
for (int i = 0; i<n; ++i)
{
d[i] = MAX;
path[i] = -1;
isUnion[i] = 0;
}
for (int i = 0; i<n; ++i)
{
if (p[s][i] != MAX)
{
d[i] = p[s][i];
path[i] = s;
}
}
isUnion[s] = 1;
d[s] = 0;
int min, t = s;
for (int i = 1; i<n; ++i)
{
min = MAX;
for (int j = 0; j<n; ++j)
{
if (isUnion[j] == 0 && d[j] < min)
{
min = d[j];
t = j;
}
}
isUnion[t] = 1;
for (int k = 0; k<n; ++k)
{
if (p[t][k] != MAX)
if (!isUnion[k] && d[k] > d[t] + p[t][k])
{
d[k] = d[t] + p[t][k];
path[k] = t;
}
}
}
}
int main()
{
int s, i, j, temp;
FILE *file = freopen("in6.txt", "r", stdin);
if (!file)
return 1;
scanf("%d", &s);
if (s == 1){ printf("%d\n", 0); return 0; }
for (i = 0; i<s; i++)
for (j = 0; j<s; j++)
{
scanf("%d", &temp);
if (temp == 0)
w[i][j] = MAX;
else w[i][j] = temp;
}
temp = 0;
for (j = 0; j<s; j++)
{
shortestPath(w, s, d, path, j);
for (i = 1; i<s; i++)
if (d[i]>temp&&d[i] != MAX)temp = d[i];
else if (d[i] == MAX){ printf("%d\n", -1); return 0; }
}
printf("%d\n", --temp);
return 0;
}