1. 程式人生 > >Ex 5_21 無向圖G=(V,E)的反饋邊集..._第九次作業

Ex 5_21 無向圖G=(V,E)的反饋邊集..._第九次作業

依次 數量 rri 利用 邊集數組 .so lose 邊集 list

技術分享圖片

根據題意,求的是最大生成樹。利用Kruskal算法,對邊進行從大到小的順序進行排序,然後再依次取出邊加入結果集中。假設圖有n個頂點,那麽,當結果集中有n-1條邊時,剩下的邊的集合即為反饋邊集。

技術分享圖片
  1 package org.xiu68.ch05.ex9;
  2 
  3 import java.util.ArrayList;
  4 import java.util.Comparator;
  5 
  6 public class Ex5_21 {
  7 
  8     public static void main(String[] args) {
  9         //
TODO Auto-generated method stub 10 int[][] edges=new int[][]{ 11 {0,2,1,6}, 12 {2,0,5,3}, 13 {1,5,0,4}, 14 {6,3,4,0} 15 }; 16 ArrayList<String> vexs=new ArrayList<>(); 17 for(int i=0;i<4;i++) 18 vexs.add("v"+i);
19 MGraph<String> m1=new MGraph<String>(4,4,edges,vexs); 20 m1.kruskal(); 21 //運行結果 22 /* 23 (0,3):6 24 (1,2):5 25 (2,3):4 26 (1,3):3 27 (0,1):2 28 (0,2):1 29 *************************************
30 反饋邊集為: 31 (1,3):3 32 (0,1):2 33 (0,2):1 34 */ 35 } 36 } 37 38 //邊類型 39 class Edge{ 40 public int head; //頭頂點序號 41 public int tail; //尾頂點序號 42 public int cost; //權值 43 44 public Edge(int head, int tail, int cost) { 45 super(); 46 this.head = head; 47 this.tail = tail; 48 this.cost = cost; 49 } 50 } 51 52 //鄰接矩陣表示圖 53 class MGraph<T> implements Comparator<Edge>{ 54 public int vexNum; //頂點數量 55 public int edgeNum; //邊數量 56 public ArrayList<T> vexs; //頂點表 57 public int[][] edges; //鄰接矩陣 58 59 public MGraph(int vexNum, int edgeNum, int[][] edges, ArrayList<T> vexs) { 60 this.vexNum = vexNum; 61 this.edgeNum = edgeNum; 62 this.edges = edges; 63 this.vexs=vexs; 64 } 65 66 //返回反饋邊集 67 public void kruskal(){ 68 ArrayList<Edge> eds=new ArrayList<>(); 69 //初始化邊集數組 70 for(int i=0;i<edges.length;i++){ 71 for(int j=i+1;j<edges[i].length;j++){ 72 if(edges[i][j]==0) 73 continue; 74 Edge e=new Edge(i,j,edges[i][j]); 75 eds.add(e); 76 } 77 } 78 79 //對邊集數組進行排序 80 eds.sort(this); 81 82 for(int i=0;i<eds.size();i++) 83 System.out.println("("+eds.get(i).head+","+eds.get(i).tail+"):"+eds.get(i).cost); 84 85 ArrayList<Edge> resultSet=new ArrayList<>(); //存放反饋邊集 86 int[] components=new int[vexNum]; //並查集 87 for(int i=0;i<vexNum;i++) 88 components[i]=i; 89 90 int k=0,j=0; 91 while(k<vexNum-1){ 92 93 int h1=eds.get(j).head; 94 int t1=eds.get(j).tail; 95 int com1=components[h1]; 96 int com2=components[t1]; 97 98 //在不同的並查集 99 if(com1!=com2){ 100 k++; 101 for(int i=0;i<vexNum;i++){ 102 if(components[i]==com2) 103 components[i]=com1; 104 } 105 }else{ 106 //反饋邊集 107 resultSet.add(eds.get(j)); 108 } 109 j++; 110 } 111 112 //找到n-1條邊後,剩下的邊也屬於反饋邊集 113 for(int i=j;i<eds.size();i++) 114 resultSet.add(eds.get(i)); 115 116 System.out.println("*************************************"); 117 System.out.println("反饋邊集為:"); 118 for(int i=0;i<resultSet.size();i++) 119 System.out.println("("+resultSet.get(i).head+","+resultSet.get(i).tail+"):"+resultSet.get(i).cost); 120 } 121 122 @Override 123 public int compare(Edge e1, Edge e2) { 124 // TODO Auto-generated method stub 125 //按從大到小排序 126 if(e1.cost<e2.cost) 127 return 1; 128 else 129 return -1; 130 } 131 }
View Code

Ex 5_21 無向圖G=(V,E)的反饋邊集..._第九次作業