题目:
输入数据:
测试数据1:
6 10
1 2 16
1 6 21
1 5 19
2 3 5
2 4 6
2 6 11
3 4 6
6 4 14
5 4 18
5 6 33
测试数据2:
2 1
1 2 9
输出数据:
输出数据1:
Case 1:56
(2,3)(2,4)(2,6)(1,2)(4,5)
输出数据2:
Case 2:9
(1,2)
算法思路:用tv装已连接的顶点,v装未连接的顶点,每次找tv中的所有顶点与v中的所有顶点的边中的最小边,连接最小边,将最小边中属于v集合顶点加入到tv中,并将其在v中删除,如此循环至t全部顶点都在tv中.
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;
public class Main {
static int max=9999;
public static void main(String[] args) {
// TODO Auto-generated method stub
int Id=1;
Scanner cin= new Scanner(System.in);
while(cin.hasNext()){
int m=cin.nextInt();
int n =cin.nextInt();
int a[][]=new int[m+1][m+1];
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
a[i][j]=max;
}
}
for(int i=0;i<n;i++){
int xx=cin.nextInt();
int yy=cin.nextInt();
int s=cin.nextInt();
a[xx][yy]=a[yy][xx]=s;
}
//装已连接的顶点
List <Integer>tv=new ArrayList<Integer>();
//装未已连接的顶点
List <Integer>v=new ArrayList<Integer>();
tv.add(1);
for(int i=2;i<=m;i++) {
v.add(i);
}
int sum=0;
String str="";
while(tv.size()!=m) {
int min=max;
int id=0;
int tt=0;
int tt2=0;
for(int i=0;i<tv.size();i++) {
int t=tv.get(i);
for(int j=0;j<v.size();j++) {
if(min>a[t][v.get(j)]) {
min=a[t][v.get(j)];
id=v.get(j);
tt=j;
tt2=t;
}
}
}
sum+=min;
tv.add(id);
v.remove(tt);
if(id<tt2)
{
int temp=id;
id=tt2;
tt2=temp;
}
str+="("+tt2+","+id+")";
}
System.out.println("Case "+Id+":"+sum);
Id++;
System.out.println(str);
}
}
}