无向图的邻接矩阵存储结构:
public class Undigraph {
final int max=32767;
final int num=100;
String []s;
int a[][];
int vnum,anum;
public Undigraph(int vnum, int anum) {
super();
this.vnum = vnum;
this.anum = anum;
s=new String[vnum];
a=new int[vnum][vnum];
}
public void create() {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入顶点:");
for(int i=0;i<vnum;i++)
s[i]=scanner.next();
for(int i=0;i<vnum;i++)
for(int j=0;j<vnum;j++)
{ if(i==j)
a[i][j]=0;
else
a[i][j]=max;
}
System.out.println("请输入边和权值:");
int k;
for(k=0;k<anum;k++) {
int w;
String s1=null;
String s2=null;
s1=scanner.next();
s2=scanner.next();
w=scanner.nextInt();
int c=0,d = 0;
for(int t=0;t<vnum;t++) {
if(s[t].equals(s1)) {
c=t;
}
if(s[t].equals(s2))
d=t;
}
a[c][d]=w;
a[d][c]=w;
if(k<anum-1)
System.out.println("请输入边:");
}
}
}
测试代码:
public class Text {
public static void main(String[] args) {
Undigraph g=new Undigraph(6,10);
g.create();
for(int i=0;i<g.vnum;i++) {
for(int j=0;j<g.vnum;j++) {
//if(g.a[i][j]!=32767)
System.out.print(g.a[i][j]+" ");
}
System.out.println();
}
System.out.println("------------------------");
prim(g);
}
Prim算法:
public static void prim(Undigraph g) {
int i,j,k,min;
int adjvex[]=new int[g.vnum]; //adjvex[i]存要找的点i和已经找到的点相关联的权值最小的边
int lowcost[]=new int[g.vnum]; // lowcost[i]存找到的点i的前一个点
lowcost[0]=0;
adjvex[0]=0;
for(i=1;i<g.vnum;i++) {
lowcost[i]=g.a[0][i];
adjvex[i]=0;
}
for(i=1;i<g.vnum;i++) {
min=65535;
j=1;
k=0;
while(j<g.vnum) {
if(lowcost[j]!=0&&lowcost[j]<min) {
min=lowcost[j];
k=j;
}
j++;
}
System.out.println(adjvex[k]+" "+k);
lowcost[k]=0;
for(j=1;j<g.vnum;j++) {
if(lowcost[j]!=0 && g.a[k][j]<lowcost[j]) {
lowcost[j]=g.a[k][j];
adjvex[j]=k;
}
}
}
}