Floyd算法:
//07-图4 哈利·波特的考试
import java.util.Scanner;
class Graph{
private int V;
private int E;
private int MaxSum = 1000;
private int[][] adv;
public Graph(int V, int E){
this.V = V;
this.E = E;
adv = new int[V][V];
}
public Graph(Scanner s){
this( s.nextInt(), s.nextInt());
for(int i = 0; i < E; i ++){
int v = s.nextInt();
int w = s.nextInt();
int l = s.nextInt();
addEdge(v, w, l);
}
for(int i = 0; i < V; i ++){
for(int j = 0; j < V; j ++){
if(i != j && adv[i][j] == 0) addEdge(i + 1, j + 1, MaxSum);
}
}
}
public void addEdge(int v, int w, int l){
adv[v - 1][w - 1] = l;
adv[w - 1][v - 1] = l;
}
public int[][] adv(){
return adv;
}
}
public class Main{
static int MaxSum = 1000;
static void Floyd(int [][] Dis){
int N = Dis.length;
for(int k = 0; k < N; k ++){
for(int i = 0; i < N; i ++){
for(int j = 0; j < N; j ++){
if(Dis[i][j] > Dis[i][k] + Dis[k][j]) Dis[i][j] = Dis[i][k] + Dis[k][j];
}
}
}
}
static int findmax(int[] row){
int max = row[0];
for(int n : row){
if(n > max) max = n;
}
return max;
}
static void judge(int[][] D){
int min = findmax(D[0]);
int index = 0;
for(int i = 0; i < D.length; i ++){
if(min > findmax(D[i])) {
min = findmax(D[i]);
index = i;
}
}
if(min == MaxSum) System.out.println(0);
else System.out.println(index + 1 + " " + min);
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
Graph G = new Graph(s);
int[][] Distance = G.adv();
Floyd(Distance);
judge(Distance);
}
}
对每个顶点使用Dijkstra算法(由于时间复杂度的原因第四个测试点会运行超时):
import java.util.Scanner;
import java.util.Arrays;
class node{
int index;
int weigth;
node next;
}
class raph{
private int MaxSum = 1000;
private int V;
private int E;
private node[] nodes;
private int[][] D;
public raph(int V, int E){
this.V = V;
this.E = E;
nodes = new node[V];
D = new int[V][V];
for(int[] row : D) Arrays.fill(row, MaxSum);
for(int i = 0; i < V; i ++) {
nodes[i] = new node();
nodes[i].index = i;
}
}
public raph(Scanner s){
this(s.nextInt(), s.nextInt());
for(int i = 0; i < E; i ++){
int v = s.nextInt();
int w = s.nextInt();
int l = s.nextInt();
addEdge(v - 1, w - 1, l);
addEdge(w - 1, v - 1, l);
}
}
void addEdge(int v, int w, int l){
node newnode = new node();
newnode.index = w ;
newnode.weigth = l;
newnode.next = nodes[v].next;
nodes[v].next = newnode;
}
public int V(){
return V;
}
public node[] nodes(){
return nodes;
}
public void Dijkstra(int i){
boolean[] visited = new boolean[V];
D[i][i] = 0;
visited[i] = true;
for(node n = nodes[i].next; n != null; n = n.next){
D[i][n.index] = n.weigth;
//visited[n.index] = true;
}
while(true){
int index = V;
int min = MaxSum;
for(int j = 0; j < V; j ++){
if(!visited[j]) {
if(min > D[i][j]){
index = j;
min = D[i][j];
}
}
}
if(index == V) break;
visited[index] = true;
for(node n = nodes[index].next; n != null; n = n.next){
if(D[i][n.index] > D[i][index] + n.weigth) D[i][n.index] = D[i][index] + n.weigth;
}
}
}
public int[][] D(){
return D;
}
}
public class Main {
static int MaxSum = 1000;
static int findmax(int[] row){
int max = row[0];
for(int n : row){
if(n > max) max = n;
}
return max;
}
static void judge(int[][] D){
int min = findmax(D[0]);
int index = 0;
for(int i = 0; i < D.length; i ++){
if(min > findmax(D[i])) {
min = findmax(D[i]);
index = i;
}
}
if(min == MaxSum) System.out.println(0);
else System.out.println(index + 1 + " " + min);
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
raph G = new raph(s);
/*node[] nodes = G.nodes();
for(node n : nodes){
while(n != null){
System.out.print(n.index + " ");
n = n.next;
}
System.out.println();
}*/
for(int i = 0; i < G.V(); i ++){
G.Dijkstra(i);
}
int[][] D = G.D();
//for(int[] a : D) System.out.println(Arrays.toString(a));
judge(D);
}
}