最短距離

距離"-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();
		}
		*/


	}