题目:http://acm.pku.edu.cn/JudgeOnline/problem?id=1125
思路:佛洛依德算法,求出每对点的最短距离。最后枚举每行(即每个人),找每个人最大的,所有人中最小的。
- import java.io.BufferedInputStream;
- import java.io.IOException;
- import java.util.Scanner;
- public class Main {
- final static int MAXVALUE = 10000000;
- public static void main(String[] args) throws NumberFormatException,
- IOException {
- Scanner read = new Scanner(new BufferedInputStream(System.in));
- int t, num;
- int[][] p;
- int min, max, start;
- while ((t = read.nextInt()) != 0) {
- p = new int[t][t];
- for (int i = 0; i < t; i++) {
- for (int j = 0; j < t; j++) {
- p[i][j] = MAXVALUE;
- }
- }
- for (int i = 0; i < t; i++) {
- p[i][i] = 0;
- }
- for (int i = 0; i < t; i++) {
- num = read.nextInt();
- for (int j = 0; j < num; j++) {
- p[i][read.nextInt() - 1] = read.nextInt();
- }
- }
- for (int k = 0; k < t; k++) {
- for (int i = 0; i < t; i++) {
- for (int j = 0; j < t; j++) {
- if (p[i][j] > p[i][k] + p[k][j]) {
- p[i][j] = p[i][k] + p[k][j];
- }
- }
- }
- }
- min = Integer.MAX_VALUE;
- start = -1;
- loop: for (int i = 0; i < t; i++) {
- max = Integer.MIN_VALUE;
- for (int j = 0; j < t; j++) {
- if (p[i][j] == MAXVALUE) {
- continue loop;
- } else {
- max = Math.max(max, p[i][j]);
- }
- }
- if (max < min) {
- min = max;
- start = i;
- }
- }
- if (start != -1) {
- System.out.println((start + 1) + " " + min);
- } else {
- System.out.println("disjoint");
- }
- }
- }
- }