题目:

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. CF1141D Colored Boots

    There are n left boots and n right boots. Each boot has a color which is denoted as a lowercase Lati ...

  2. 使用apply调用函数

    实现函数 calllt,调用之后满足如下条件1.返回的结果为调用fn之后的结果2.fn的调用为calllt的第一个参数之后的全部参数 方法1 使用es6 function calllt(...para ...

  3. Apache使用mod_jk/mod_proxy模块实现代理、负载均衡的配置

    转载自:https://blog.csdn.net/yuanyuan_186/article/details/51290518 192.168.1.123/192.168.1.121为后端tomcat ...

  4. HDU - 4576 Robot(概率dp+滚动数组)

    题意:所有的格子围成一个圈,标号为1~n,若从格子1出发,每次指令告知行走的步数,但可能逆时针也可能顺时针走,概率都是1/2,那么问走了m次指令后位于格子l~r(1≤l≤r≤n)的概率. 分析: 1. ...

  5. UVA - 11105 Semi-prime H-numbers(H-半素数)

    题意:所有形如4n+1(n为非负整数)的数叫H数.定义1是唯一的单位H数,H素数是指本身不是1,且不能写成两个不是1的H数的乘积.H-半素数是指能写成两个H素数的乘积的H数(这两个数可以相同也可以不同 ...

  6. c++ opencv 入门

    //类型定义 CvPoint point(2, 3); CvPoint2D32f point1(2, 3); CvPoint3D32f point2(2, 3); CvSize size(2, 3); ...

  7. X2安装配置keras环境(包含matplotlib安装)

    https://blog.csdn.net/jonado13/article/details/83933453 1.安装pipapt install python3-pipE: Could not o ...

  8. Discuz中常用的编辑器代码

    .[ b]文字:在文字的位置可以任意加入您需要的字符,显示为粗体效果. .[ i]文字:在文字的位置可以任意加入您需要的字符,显示为斜体效果. .[ u]文字:在文字的位置可以任意加入您需要的字符,显 ...

  9. springboot入门学习1

    springboot学习1 SpringBoot对Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑 业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中 ...

  10. JAVAEE 和项目开发(第三课:HTTP的请求头和请求方式)

    HTTP 协议之请求格式   请求格式的结构:请求行:请求方式.请求的地址和 HTTP 协议版本 请求头:消息报头,一般用来说明客户端要使用的一些附加信息 空行: 位于请求行和请求数据之间,空行是必须 ...