题目:

For a group of people, there is an idea that everyone is equals to or less than 6 steps away from any other person in the group, by way of introduction. So that a chain of "a friend of a friend" can be made to connect any 2 persons and it contains no more than 7 persons.

For example, if XXX is YYY’s friend and YYY is ZZZ’s friend, but XXX is not ZZZ's friend, then there is a friend chain of length 2 between XXX and ZZZ. The length of a friend chain is one less than the number of persons in the chain.

Note that if XXX is YYY’s friend, then YYY is XXX’s friend. Give the group of people and the friend relationship between them. You want to know the minimum value k, which for any two persons in the group, there is a friend chain connecting them and the chain's length is no more than k .

input:

There are multiple cases.

For each case, there is an integer N (2<= N <= 1000) which represents the number of people in the group.

Each of the next N lines contains a string which represents the name of one people. The string consists of alphabet letters and the length of it is no more than 10.

Then there is a number M (0<= M <= 10000) which represents the number of friend relationships in the group.

Each of the next M lines contains two names which are separated by a space ,and they are friends.

Input ends with N = 0.

output:

For each case, print the minimum value k in one line.

If the value of k is infinite, then print -1 instead.

Sample input:

3
XXX
YYY
ZZZ
2
XXX YYY
YYY ZZZ
0

Sample output:

2

题意:

多组输入,第一行给一个n然后输入n个结点(字符串,用map转为int),然后输入一个m代表m条路,然后输入m组数据代表两个点直接有一条路,所有路权值都为1,输出任意两个结点最短路之中的最大值,如果有两个结点之间没有路,那么输出-1。

分析:

对每个点bfs搜最短路,用dis[i][j]代表i结点到j结点的距离,刚开始全部初始化为inf,dis[i][i] = 0。对每个点搜完后对所有最短路遍历,记录最大值ans,如果ans为inf就输出-1,否则输出ans。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;
const int inf = 0x3f3f3f3f;
int vis[maxn],dis[maxn][maxn],ans = 0;
vector<int> v[maxn];
void bfs(int u){
dis[u][u] = 0;
memset(vis,0,sizeof vis);
queue<int> q;
vis[u] = 1;
q.push(u);
while (!q.empty()){
int tmp = q.front();
q.pop();
int len = v[tmp].size();
for (int i = 0; i < len; i++){
int to = v[tmp][i];
if (!vis[to]){
dis[u][to] = dis[u][tmp] + 1;
vis[to] = 1;
q.push(to);
}
}
}
}
int main(void){
int n,m;
map<string,int> mp;
char str1[15],str2[15];
while (scanf("%d",&n),n){
for (int i = 0; i < n; i++)v[i].clear();
ans = 0;
for (int i = 1; i <= n; i++){
scanf("%s",str1);
mp[str1] = i;
}
scanf("%d",&m);
for (int i = 1; i <= m; i++){
scanf("%s%s",str1,str2);
v[mp[str1]].push_back(mp[str2]);
v[mp[str2]].push_back(mp[str1]);
}
for (int i = 1; i <= n; i++){
for (int j = i+1; j <= n; j++){
dis[i][j] = dis[j][i] = inf;
}
}
for (int i = 1; i <= n; i++)
bfs(i);
for (int i = 1; i <= n; i++){
for (int j = i+1; j <= n; j++){
if (dis[i][j] > ans) ans = dis[i][j];
}
}
printf("%d\n",ans==inf?-1:ans);
}
return 0;
}

需要注意点:

此题用链式前向星TLE,需要改为vector存边,原因不详

此题还可以用类似求树的直径的做法求解(未尝试,有待确认),速度更快

HDU-4460 Friend Chains(BFS&权为1所有最短路的最大值)的更多相关文章

  1. HDU 4460 Friend Chains --BFS

    题意:问给定的一张图中,相距最远的两个点的距离为多少.解法:跟求树的直径差不多,从1 开始bfs,得到一个最远的点,然后再从该点bfs一遍,得到的最长距离即为答案. 代码: #include < ...

  2. HDU 4460 Friend Chains (BFS,最长路径)

    题意:给定 n 个人,和关系,问你这个朋友圈里任意两者之间最短的距离是多少. 析:很明显的一个BFS,只要去找最长距离就好.如果不能全找到,就是-1. 代码如下: #pragma comment(li ...

  3. HDU 4460 Friend Chains(map + spfa)

    Friend Chains Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  4. HDU 4460 Friend Chains

    Problem Description For a group of people, there is an idea that everyone is equals to or less than ...

  5. HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)

    题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...

  6. [HDU 3712] Fiolki (带边权并查集+启发式合并)

    [HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...

  7. hdu 4460 第37届ACM/ICPC杭州赛区H题 STL+bfs

    题意:一些小伙伴之间有朋友关系,比如a和b是朋友,b和c是朋友,a和c不是朋友,则a和c之间存在朋友链,且大小为2,给出一些关系,求出这些关系中最大的链是多少? 求最短路的最大距离 #include& ...

  8. hdu 1565&hdu 1569(网络流--最小点权值覆盖)

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. hdu 2102 A计划-bfs

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

随机推荐

  1. java流程控制语句要点

    java流程控制语句要点 一.java7增强后的switch switch语句后面的控制表达式的数据类型只能是byte.short.char.int四种整数类型,不能是boolean类型,java7以 ...

  2. 3-Java逻辑控制语句

    目录 Java选择结构 Java循环结构 return.break.continue Math.random()的使用和条件运算符 1.Java选择结构 1.1.if(布尔表达式)单选结构 - 当布尔 ...

  3. 二十三、SAP中内表的修改

    一.通过MODIFY关键字来修改内表的内容,it相当于全部内容,wa相当于一条内容 二.效果如下

  4. 【iOS】Swift4.0 GCD的使用笔记

    https://www.jianshu.com/p/47e45367e524 前言 在Swift4.0版本中GCD的常用方法还是有比较大的改动,这里做个简单的整理汇总. GCD的队列 队列是一种遵循先 ...

  5. java排序,效率高的是哪种排序方法

    和所有其他语言是一样的.应该还是快速排序效率最高. public static void bubbleSort(int a[]) {int len = a.length;for (int i = 0; ...

  6. opencv+python+dlib人脸关键点检测、实时检测

    安装的是anaconde3.python3.7.3,3.7环境安装dlib太麻烦, 在anaconde3中新建环境python3.6.8, 在3.6环境下安装dlib-19.6.1-cp36-cp36 ...

  7. 第十篇 Form表单

    Form表单 阅读目录(Content) Form介绍 普通的登录 使用form组件 Form那些事儿 常用字段演示 校验 使用Django Form流程 补充进阶 应用Bootstrap样式 批量添 ...

  8. Linux课后练习(第二章命令)20200218

  9. Cobalt Strike简单使用(9,29第十五天)

    本文转自:https://www.cnblogs.com/yuanshu/p/11616657.html 一.介绍: 后渗透测试工具,基于Java开发,适用于团队间协同作战,简称“CS”. CS分为客 ...

  10. AD中内电层设置

    用于走线与普铜 内电层分割