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 }
View Code

 

以上是关于Ex3_7无向图二部图的主要内容,如果未能解决你的问题,请参考以下文章

如何判断一个图是不是为有向无环图(DAG)

7-8-无向图的关节点-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

二分图判断(交叉染色)

7-4-无向图的邻接多重表存储结构-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

二分图匹配

邻接矩阵无向图