Ex3_7无向图二部图
Posted 薰衣草
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ex3_7无向图二部图相关的知识,希望对你有一定的参考价值。
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 }
以上是关于Ex3_7无向图二部图的主要内容,如果未能解决你的问题,请参考以下文章
7-8-无向图的关节点-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版