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]);
}//这里是可以输出正确的.
}
}
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]);
}//这里是可以输出正确的.
}
}
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]);
}//这里是可以输出正确的. }
}
请指点指点
{
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[][])