TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
- [img]http://img.javaxxz.com/2014/12/1/000548531.jpg[/img]
- import java.util.Scanner;
- class Edge {
- /**
- * 边的起点
- */
- char vexa;
- /**
- * 边的终点
- */
- char vexb;
- /**
- * 边的权植
- */
- int weight;
- Edge(char vexa, char vexb, int weight) {
- this.vexa = vexa;
- this.vexb = vexb;
- this.weight = weight;
- }
- }
- public class MST {
- int n;//图的顶点数
- int m;//图的边数
-
- Edge[] e ;//图的所有边
- public MST(int n,int m,Edge[] e){
- /**
- * 初始化图
- */
- this.n=n;
- this.m=m;
- this.e=e;
- }
- /**
- * w函数
- * @param x 起点序号
- * @param y 终点序号
- * @return 返回起点序号为x,终点序号为y的边的权植。如果没有这条边就返回无穷大
- */
- private int w(int x, int y) {
- char from = (char) (x + 97);
- char to = (char) (y + 97);
- for (int i = 0; i < m; i++) {
- if (e[i].vexa == from && e[i].vexb == to) {
- return e[i].weight;
- }
- if (e[i].vexa == to && e[i].vexb == from) {
- return e[i].weight;
- }
- }
- return 1000; // 用1000代表无穷大,如果图中没有这条边就返回无穷大
- }
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- while (sc.hasNext()) {
- int n = sc.nextInt();//图的顶点数
- int m = sc.nextInt(); //图的边数
-
- if (n == 0 && m == 0)
- break;
- Edge[] e=new Edge[m];
- for (int i = 0; i < m; ++i) {
- int u = sc.nextInt();
- int v = sc.nextInt();
- int w = sc.nextInt();
- e[i]=new Edge((char)(u+97),(char)(v+97),w);
- }
- MST mst=new MST(n,m,e);
- Edge[] ee =mst.prime(); //存放最小生成树的n-1条边
-
- for (int i = 0; i < n - 1; ++i) {
- System.out.println(ee[i].vexa + " " + ee[i].vexb + " "
- + ee[i].weight);
- }
- }
- }
-
- public Edge[] prime(){
- Edge[] e=new Edge[n];//存放最小生成树的n-1条边
- // 表示已经加入最小生成树(mst)的结点, 数组元素从0到n-1分别对应结点a到(char)(n-1+97)
- // 如果vex_mst[i]=0,表示对应结点没有加入到mst
- // 如果vex_mst[i]=1,表示对应结点已经加入到mst
- int[] vex_mst = new int[n];
- for (int i = 0; i < n; i++)
- // 初始化
- vex_mst[i] = 0;
- vex_mst[0] = 1; // 设置初始结点为a
- // 将n-1条边加入到最小生成树
- for (int i = 0; i < n-1; i++) {
- // 加入一条边。
- // 这条边的两个结点一个在mst中,而另一个不在mst中而且具有最小权植
- int add_vex = 0; // 选中的结点
- int min_weight = 1000; // 最小权植,初始值为1000
- Edge adde = new Edge(" ", " ", 0);
- for (int j = 0; j < n; j++)
- if (vex_mst[j] == 1) { // j是mst中的结点
- for (int k = 0; k < n; k++) {
- if (vex_mst[k] == 0 && w(j, k) < min_weight) {
- add_vex = k;
- min_weight = w(j, k);
- adde.vexa = (char) (j + 97);
- adde.vexb = (char) (k + 97);
- adde.weight = w(j,k);
- }
- }
- }
- vex_mst[add_vex] = 1; // 将选择的结点加入mst
- e[i]=adde;
- }
-
- return e;
- }
- }
-
复制代码 运行: C:aaa>java MST
5 8
0 1 2
1 4 9
4 3 7
3 0 10
0 2 12
2 4 3
1 2 8
2 3 6
a b 2
b c 8
c e 3
c d 6
0 0
源码下载:http://file.javaxxz.com/2014/12/1/000548890.zip |
|