最短距離
距離"-1"はエッジなしに相当
public class WarshallFloyd {
public static int[][][] WFshortestDist(int[][] a){
int n=a.length;
int[][] dist=StatUtilsX.MiscUtilX.DeepCopyInt2(a);
int[][] pred=new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(dist[i][j]>0){
pred[i][j]=j;
}else{
pred[i][j]=-1;
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if(dist[i][k]<0 || dist[j][k]<0){
}else if(dist[i][j]<0){
dist[i][j]=dist[i][k]+dist[j][k];
pred[i][j]=pred[i][k];
}else if(dist[i][j]>dist[i][k]+dist[j][k]){
dist[i][j]=dist[i][k]+dist[j][k];
pred[i][j]=pred[i][k];
}
}
}
}
int[][][] ret =new int[2][n][n];
ret[0]=dist;
ret[1]=pred;
return ret;
}
}public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
int n=1000;
int x=n*(n-1)/2;
int[] data=new int[x];
int max=2;
for(int i=0;i<x;i++){
data[i]=(int)(Math.random()*max);
if(data[i]==0){
data[i]=-1;
}
}
int[][] dist=new int[n][n];
int a=0;
int b=1;
for(int i=0;i<x;i++){
dist[a][b]=data[i];
dist[b][a]=data[i];
b++;
if(b==n){
a++;
b=a+1;
}
}
/*
for(int i=0;i<dist.length;i++){
for(int j=0;j<dist[i].length;j++){
System.out.print(dist[i][j]+"\t");
}
System.out.println();
}
*/
int[][][] ans=WarshallFloyd.WFshortestDist(dist);
System.out.println("dist");
/*
for(int i=0;i<ans[0].length;i++){
for(int j=0;j<ans[0][i].length;j++){
System.out.print(ans[0][i][j]+"\t");
}
System.out.println();
}
*/
/*
System.out.println("predecessor");
for(int i=0;i<ans[1].length;i++){
for(int j=0;j<ans[1][i].length;j++){
System.out.print(ans[1][i][j]+"\t");
}
System.out.println();
}
*/
}