求助:水题...ACM POJ 3625...
郁闷了!一水题,最短路径问题,prim算法。
今晚刚写了一程序,老是RE!
诚挚求助各位大牛!
这是POJ3625题 http://acm.pku.edu.cn/JudgeOnline/problem?id=3625
java写的,可能是prim算法出了错,就是不知道哪里错了...谢谢各位大牛们!
import java.util.*;
public class POJ3625 {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
int m=cin.nextInt();
int[] x=new int[n];
int[] y=new int[n];
double[][] w=new double[n][n];//权值
for(int i=0;i<n;i++){//n个顶点坐标
x[i]=cin.nextInt();
y[i]=cin.nextInt();
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
w[i][j]=Math.sqrt(Math.pow((x[i]-x[j]),2)+Math.pow((y[i]-y[j]),2));
}
}
for(int i=0;i<m;i++){
int a=cin.nextInt();
int b=cin.nextInt();
w[a-1][b-1]=w[b-1][a-1]=0;
}
java.text.DecimalFormat df=new java.text.DecimalFormat("#.00");
System.out.println(df.format(prim(1,n,w)));
}
static int prim(int v,int n,double[][] dist){
int sv=0,ev=0;
int sum=0;
double[] edgeweight=new double[n];//记录最短路径权值 edgeweight[j] 即v到j的最短路径权值
int[] edge=new int[n];//记录最短路径端点 edge[j]=k 即j与k相连
double temp;
int source=v;
boolean mstv[]=new boolean[n];
for(int j=0;j<n;j++){
mstv[j]=false;
edge[j]=source;
edgeweight[j]=dist[source][j];
}
mstv[source]=true;
edgeweight[source]=0;
for(int i=0;i<n-1;i++){
temp=Integer.MAX_VALUE;
for(int j=0;j<n;j++){//循环找出与已知路径各个点连接的最短的边、点
if(mstv[j]){
for(int k=0;k<n;k++){//找出其中与j连接的最短的边、点
if(!mstv[k]&&dist[j][k]<temp){
ev=k;
sv=j;
temp=dist[j][k];
}
}
}
}
mstv[ev]=true;//找出后 标记K 表示K连接到了最短路径中
edge[ev]=sv;
edgeweight[ev]=temp;
sum+=temp;
}
return sum;
}
}
[解决办法]
单步调试,输出中间结果比较
[解决办法]
RE ===runtime error
你的数组可能越界了
[解决办法]
用C++ code 把代码按格式发出来。