import java.io.*;
public class Dijkstra
{
static int n=0;
static int v=0;
static int maxint=100;
static int dist[]=null;
static int prev[]=null;
static int   a[][]=null;

public   static   void   main(String[]   args)   { 


System.out.println("依次输入两点的权值,若两点无路径输入32767");
a=getvalue();

for(int i=0;i<a.length;i++){
for(int j=0;j<a.length;j++){
System.out.println("a["+(i+1)+"]["+(j+1)+"]is"+a[i][j]);
}
}
System.out.println("请输入源点");
InputStreamReader   isr   =   new   InputStreamReader(System.in);   
BufferedReader   br   =   new   BufferedReader(   isr   ); 
try { 
v=Integer.parseInt(br.readLine()); 
}catch(NumberFormatException   e1){ 
e1.printStackTrace(); 
}catch(IOException   e1){
e1.printStackTrace(); 
} Dijkstra( n, v, dist, prev,a);
System.out.println("n is"+n);
System.out.println("prev["+2+"]"+"is"+dist[2]);
//for(int i=0;i<n;i++){
//System.out.println("prev["+i+"]"+"is"+prev[i]);//而这里不输出.Exception in thread "main"                        java.lang.NullPointerException错误
//}
}//end main

 
static   int[][]   getvalue() 
{  System.out.println("please   input   num"); 
InputStreamReader   isr   =   new   InputStreamReader(System.in);   
BufferedReader   br   =   new   BufferedReader(   isr   ); 
 
try   { 
n   =   Integer.parseInt(br.readLine()); 
}   catch   (NumberFormatException   e1)   { 

e1.printStackTrace(); 
}   catch   (IOException   e1)   { 

e1.printStackTrace(); 
}

int[][]   list   =   new   int[n][n]; 
int   i=0,j=0; 

String temp;
for(i=0  ;i <n;i++) 

for(j=0;j<n;j++)
{
   isr   =   new   InputStreamReader(System.in);   
   br   =   new   BufferedReader(   isr   ); 
   System.out.println("please   input   parame["+(i+1)+"]["+(j+1)+"]"); 
   try{ 
   temp  =br.readLine();
   list[i][j] = Integer.valueOf(temp).intValue();  
   }   
   catch   (IOException   e){
   e.printStackTrace(); 
   } 
}
}
return list;
}//end getvalue public static void Dijkstra(int n,int v,int dist[],int prev[],int c[][])
{
boolean s[]=new boolean[n];//不能写成s[n]
dist =new int[n];
prev =new int[n];
for(int i=0;i<n;i++){
dist[i]=c[v-1][i];
s[i]=false;
if(dist[i]==maxint)
prev[i]=-1;
else 
prev[i]=v-1;
}
for(int i=0;i<n;i++){
System.out.print("prev"+i+"="+prev[i]);
} dist[(v-1)]=0;
s[(v-1)]=true;
for(int i=0;i<n-1;i++){//i只是记数,循环中没用到i
int temp = maxint;
int u=v-1;
for(int j=0;j<n;j++)
if(!s[j]&&(dist[j]<temp)){
u=j;
temp=dist[j];
//System.out.print("chu shi hua ");
}
s[u]=true;
for(int j=0;j<n;j++){
//System.out.print("s[ "+j+"]"+s[j]+"c["+u+"]c["+j+"]"+c[u][j]);
if(!s[j]&&(c[u][j]<maxint)){
//System.out.print("begin ");
int newdist=dist[u]+c[u][j];
if(newdist<dist[j]){
dist[j]=newdist;
prev[j]=u;
//System.out.print("prev["+j+"]="+u+"dist["+j+"]="+newdist);
}
}
}

}
for(int i=0;i<n;i++){
System.out.println("in it"+"prev["+i+"]"+"is"+prev[i]);
}//这里是可以输出正确的.
}
}

  

解决方案 »

  1.   

     这是求单源最短路径问题.
    public static void Dijkstra(int n,int v,int dist[],int prev[],int c[][]) 

    boolean s[]=new boolean[n];//不能写成s[n] 
    dist =new int[n]; 
    prev =new int[n]; 
    for(int i=0;i <n;i++){ 
    dist[i]=c[v-1][i]; 
    s[i]=false; 
    if(dist[i]==maxint) 
    prev[i]=-1; 
    else  
    prev[i]=v-1; 

    for(int i=0;i <n;i++){ 
    System.out.print("prev"+i+"="+prev[i]); 
    } dist[(v-1)]=0; 
    s[(v-1)]=true; 
    for(int i=0;i <n-1;i++){//i只是记数,循环中没用到i 
    int temp = maxint; 
    int u=v-1; 
    for(int j=0;j <n;j++) 
    if(!s[j]&&(dist[j] <temp)){ 
    u=j; 
    temp=dist[j]; 
    //System.out.print("chu shi hua "); 

    s[u]=true; 
    for(int j=0;j <n;j++){ 
    //System.out.print("s[ "+j+"]"+s[j]+"c["+u+"]c["+j+"]"+c[u][j]); 
    if(!s[j]&&(c[u][j] <maxint)){ 
    //System.out.print("begin "); 
    int newdist=dist[u]+c[u][j]; 
    if(newdist <dist[j]){ 
    dist[j]=newdist; 
    prev[j]=u; 
    //System.out.print("prev["+j+"]="+u+"dist["+j+"]="+newdist); 


    } } 
    for(int i=0;i <n;i++){ 
    System.out.println("in it"+"prev["+i+"]"+"is"+prev[i]); 
    }//这里是可以输出正确的. 

    请指点指点
      

  2.   

    public static void Dijkstra(int n,int v,int dist[],int prev[],int c[][]) 

    boolean s[]=new boolean[n];//不能写成s[n] 
    dist =new int[n]; 
    prev =new int[n]; //这里是对参数传进来的拷贝操作,对外面不影响最简单的测试方法public void test(StringBuffer s) {
        s = new StringBuffer("abc");
        System.out.println(s.toString());
    }调用
    StringBuffer s = new StringBuffer("test");
    test(s);
    System.out.println(s.toString()); //这里打印出来的还是test在一个函数中,函数内部对参数的操作都是对参数的副本而操作的,也就是
    test(StringBuffer s) {
        StringBuffer _s = s; //编译器内存作了个参数副本,以后对s操作实际都是操作_s
        所以s= new StringBuffer("abc") 实际是_s=new StringBuffer("abc");这里是改变_s的指针,也就是让_s指向一个新的地址,而外面的s指针没有发生改变.
        但是如果不是s= new StringBuffer("abc") 而是s.append("test");那外面就发生改变了,为什么?因为s和_s指向同一个地址,_s.append是改变该指向地址的内容,s取出来的值也是_s的指向地址的内容,所以s的值是变的
    }不知道这么说LZ明白不明白?public static void Dijkstra(int n,int v,int dist[],int prev[],int c[][]) 把这里改成
    public static void Dijkstra(int n,int v,int c[][])