设计算法:Floyd
题目大意:输入n组数据,每组数据包括一个正整数m和m个数据对,例如第3次输入的数据为 2 1 4 6 5 表示编号为3的经纪人传播消息到编号为1的经纪人的时间为4,传播消息到编号为6的经纪人时间为5。要求根据n组数据求出由哪一位经纪人传播消息能以最快的速度让所有人都收到消息?求出该经纪人的编号和花费的时间
题目分析:若知道两两间的最短路径当然能求出某个及节点到其他所有结点所花费的时间,求两两间的最短路径,显然用Floyd。
代码如下:
package com.solo.dijkstra;
import java.util.Arrays;
//消息从一结点A传到所有其他的结点所需要的时间所花的时间是最少的,求出该结点和最少的时间
import java.util.Scanner;
public class Main_1125 {
static int n;
static int[][] dis=new int[101][101];
static int MAX=10000000;
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
n=in.nextInt();
int m=0;
while(n!=0){
fill(dis,MAX);
for(int i=1;i<=n;i++){
m=in.nextInt();
for(int j=0;j<m;j++){
dis[i][in.nextInt()]=in.nextInt();
}
}
floyd();
n=in.nextInt();
}
}
static void fill(int[][] a,int b){
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
if(i==j) continue;
dis[i][j]=b;
}
}
}
static int[] d=new int[101];
static void floyd(){
//寻找两两间的最短路径
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]>dis[i][k]+dis[k][j]){
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
int max=0;
for(int i=1;i<=n;i++){
max=0;
for(int j=1;j<=n;j++){
if(dis[i][j]>max){
max=dis[i][j];
d[i]=max;
}
//System.out.print("dis["+i+"]["+j+"]="+dis[i][j]+" ");
}
//System.out.println();
}
/*for(int i=1;i<=n;i++){
System.out.println("d["+i+"]="+d[i]);
}*/
int re=2147483647 ;int node=0;
for(int i=1;i<=n;i++){
if(d[i]<re){
re=d[i];
node=i;
}
}
System.out.println(node+" "+d[node]);
}
}