图算法--人肉搜索

来源:互联网 发布:日语语法新思维 知乎 编辑:程序博客网 时间:2024/06/09 17:23

XOJ:http://acm.xmu.edu.cn/problem.php?id=1078


Description

  人肉搜索与刺青、美白、护肤、减肥等直接在人肉上施行的种种行为无关。顾名思义,人肉搜索就是利用现代信息科技,变传统的网络信息搜索为人找人,人问人,人碰人,人挤人、人挨人的关系型网络社区活动,变枯燥乏味的查询过程为一人提问、八方回应,一石激起千层浪,一声呼唤惊醒万颗真心的人性化搜索体验。人肉搜索不仅可以在最短时间内揭露某某门背后的真相,为某三某七找到大众认可的道德定位,还可以在网络无法触及的地方,探寻并发现最美丽的丛林少女,最感人的高山牧民,最神秘的荒漠洞窟,最浪漫的终极邂逅…… 人肉搜索追求的最高目标是:不求最好,但求最肉。

--谷歌四月一日的愚人节笑话

  人肉搜索之所以强大,其原因在于世界上任何两个人,要么他们是朋友,要么他们是朋友的朋友,要么他们是朋友的朋友的朋友,要么他们是朋友的朋友的朋友的朋友,要么他们是朋友的朋友的朋友的朋友的朋友。。。人肉搜索引擎正是利用了这一点,对于每个问题,人肉搜索开始M层的搜索,第一层是搜索我的朋友,第二层是搜索我朋友的朋友,第三层是使搜索我朋友的朋友的朋友。。。给一个人际关系表,问M至少要为多少才能保证所有人之间可以通过人肉搜索引擎搜索到。

Input

  输入的第一行包含一个正整数N(2 <= N <= 100),表示总的人数。
  输入的第二行到第N+1行每行有N个整数,第i行第j列的数字Fij如果为1表示第i个人和第j个人是朋友,否则不是。保证Fij = Fji,Fii = 1。

Output

  输出这N个人中,保证人肉搜索引擎的正常工作(即所有人都能被搜索到)前提下,M的最小值。如果存在两个人他们不是朋友的朋友的朋友的。。。的朋友,则输出-1。

Sample Input

4
1 0 1 1
0 1 0 1
1 0 1 0
1 1 0 1

Sample Output

2

Hint

样例中,1和3是朋友,1和4是朋友,2和4是朋友。此时2和3之间间隔了1、4两个人的关系,所以结果为2。


#include<stdio.h>#define MAX 10002int 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;}


0 0