[UVA][floyd] 1056 - Degrees of Separation
In our increasingly interconnected world, it has been speculated that everyone on Earth is related to everyone else by no more than six degrees of separation. In this problem, you must write a program to find the maximum degree of separation for a network of people.
For any two people, the degree of separation is the minimum number of relationships that must be traversed to connect the two people. For a network, the maximum degree of separation is the largest degree of separation between any two people in the network. If there is a pair of people in the network who are not connected by a chain of relationships, the network is disconnected.
As shown below, a network can be described as a set of symmetric relationships each of which connects two people. A line represents a relationship between two people. Network A illustrates a network with 2 as the maximum degree of separation. Network B is disconnected.
Input
The input consists of data sets that describe networks of people. For each data set, the first line has two integers: P (2P50), the number of people in the network, and R (R1), the number of network relationships. Following that first line are R relationships. Each relationship consists of two strings that are names of people in the network who are related. Names are unique and contain no blank spaces. Because a person may be related to more than one other person, a name may appear multiple times in a data set.
The final test case is followed by a line containing two zeroes.
Output
For each network, display the network number followed by the maximum degree of separation. If the network is disconnected, display `DISCONNECTED'. Display a blank line after the output for each network. Use the format illustrated in the sample output.
Sample Input
4 4 Ashok Kiyoshi Ursala Chun Ursala Kiyoshi Kiyoshi Chun 4 2 Ashok Chun Ursala Kiyoshi 6 5 Bubba Cooter Ashok Kiyoshi Ursala Chun Ursala Kiyoshi Kiyoshi Chun 0 0
Sample Output
Network 1: 2 Network 2: DISCONNECTED Network 3: DISCONNECTED
Claimer:
The data used in this problem is unofficial data
prepared by Derek Kisman. So any mistake here does not
imply mistake in the offcial judge data. Only Derek
Kisman is responsible for the mistakes. Report
mistakes to dkisman@acm.org
all pairs 全局最短路的最大值。
#include <stdio.h>
#include <iostream>
#include <map>
#define oo 0xffff
using namespace std;
int main() {
int n, m, cases = 0, i, j, k;
char a[50], b[50];
while(scanf("%d %d", &n, &m) == 2) {
if(n == 0 && m == 0)
break;
int g[51][51], x, y;
for(i = 1; i <= n; i++) {
for(j = 1; j <= n; j++)
g[i][j] = oo;
g[i][i] = 0;
}
map<string, int> R;
map<string, int>::iterator it;
int size = 0;
while(m--) {
scanf("%s %s", a, b);
it = R.find(a);
if(it == R.end())
R[a] = ++size, x = size;
else x = it->second;
it = R.find(b);
if(it == R.end())
R[b] = ++size, y = size;
else y = it->second;
g[x][y] = g[y][x] = 1;
}
for(k = 1; k <= n; k++) {
for(i = 1; i <= n; i++) {
for(j = 1; j <= n; j++) {
if(g[i][j] > g[i][k] + g[k][j])
g[i][j] = g[i][k] + g[k][j];
}
}
}
int mx = 0;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
if(g[i][j] > mx)
mx = g[i][j];
printf("Network %d: ", ++cases);
if(mx == oo)
puts("DISCONNECTED");
else
printf("%d\n", mx);
puts("");
}
return 0;
}