1. 程式人生 > >Ex3_7無向圖二部圖

Ex3_7無向圖二部圖

是否 bip clas als 數量 img f11 兩個 boolean

技術分享圖片
 1 package org.xiu68.ch03.ex11;
 2 
 3 public class Ex3_7 {
 4 
 5     //用線性時間證明一個圖是否是二部圖
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         int[][] graph=new int[][]{
 9             {0,1,0,1},
10             {1,0,1,0},
11             {0,1,0,1},
12             {1,0,1,0}
13 }; 14 MGraph m1=new MGraph(graph); 15 m1.biPartGraph(0); 16 17 18 System.out.println("************************************"); 19 int[][] graph2=new int[][]{ 20 {0,1,1,0,0}, 21 {1,0,1,0,0}, 22 {1,1,0,1,1}, 23 {0,0,1,0,1},
24 {0,0,1,1,0} 25 }; 26 MGraph m2=new MGraph(graph2); 27 m2.biPartGraph(0); 28 } 29 30 } 31 32 class MGraph{ 33 private int vexNum; //頂點數量 34 private int[][] edges; // 35 private int[][] visitedEdges; //記錄已訪問的邊 36 private
int[] visited; //標記頂點訪問狀態,-1表示未訪問到,0表示正在訪問中,1表示已訪問 37 private boolean[] color; //表示每個頂點有兩種顏色,true和false表示,表示所屬的頂點的集合(V1或V2) 38 39 public MGraph(int[][] edges){ 40 this.edges=edges; 41 this.vexNum=edges.length; 42 this.visitedEdges=new int[vexNum][vexNum]; 43 this.visited=new int[vexNum]; 44 for(int i=0;i<vexNum;i++){ 45 visited[i]=-1; 46 } 47 48 this.color=new boolean[vexNum]; 49 } 50 public void biPartGraph(int v){ 51 color[v]=true; 52 boolean result=dfs(v); 53 if(result) 54 System.out.println("二部圖"); 55 else 56 System.out.println("非二部圖"); 57 } 58 public boolean dfs(int v){ 59 visited[v]=0; 60 for(int i=0;i<vexNum;i++){ 61 if(edges[v][i]==1 && visitedEdges[v][i]!=1){ //兩個頂點存在邊未被訪問過 62 63 visitedEdges[v][i]=visitedEdges[i][v]=1; //標記邊已訪問 64 65 if(visited[i]==0){ //訪問到訪問狀態為0的頂點 66 if(color[v]==color[i]) //兩個頂點顏色相同 67 return false; 68 else //兩個頂點顏色不同 69 color[i]=!color[v]; 70 }else if(visited[i]==-1){ //訪問到訪問狀態為-1的頂點 71 color[i]=!color[v]; 72 if(!dfs(i)) 73 return false; 74 } 75 } 76 }//for 77 visited[v]=1; 78 return true; 79 } 80 }
View Code

Ex3_7無向圖二部圖