要求:先设计算法,然后用程序实现。程序可允许输入一个无向图,然后自动判断是否为二分图
注:一个图G=(V,E)是二分图如果存在V的一个划分V= XY,其中XY=空集。
话不多说,直接上代码
package test;
import java.util.Scanner;
public class graph {
public static boolean find(int x,int [] arr){
for(int i = 0;i<arr.length;i++){
if(x == arr[i])
return true;
}
return false;
}
//无向图的邻接表
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int V = scan.nextInt();//顶点的个数
int E = scan.nextInt();//边的条数
Node adj[] = new Node[V];
for(int i=0;i<V;i++){
adj[i] = null;
}
for(int i=0;i<E;i++){
String input = scan.next();
int x = Integer.parseInt(input.substring(1, 2));
int y = Integer.parseInt(input.substring(3, 4));
adj[y] = new Node(x,adj[y]);
adj[x] = new Node(y,adj[x]);
}
int one[] = new int[V];
int oth[] = new int[V];
int onee=0,othh=0;
for(int i =0;i< V;i++){
one[i] = -1;
oth[i] = -1;
}
for(int i=0;i<V;i++){
if(find(i,oth)){
for(Node temp=adj[i];temp!=null;temp=temp.next){
if(!find(temp.val,oth)&&!find(temp.val,one)){
one[onee++] = temp.val;
}else if(find(temp.val,oth)){
System.out.println("不是二分图!!!");
return;
}
}
}
else{
if(!find(i,one)){
one[onee++] = i;
}
for(Node temp=adj[i];temp!=null;temp=temp.next){
if(!find(temp.val,oth)&&!find(temp.val,one)){
oth[othh++] = temp.val;
}else if(find(temp.val,one)){
System.out.println("不是二分图!!!");
return;
}
// System.out.print(temp.val+" ");
}
}
// System.out.println();
}
System.out.println("是二分图~~~~~~~~");
System.out.println("第一部分:");
for(int i =0;i< V;i++){
System.out.print(one[i]+" ");
}
System.out.println();
System.out.println("第二部分:");
for(int i =0;i< V;i++){
System.out.print(oth[i]+" ");
}
}
static class Node{
int val;
Node next;
public Node(int val,Node next){
this.val = val;
this.next = next;
}
}
}
测试1:
6
8
(0,3)
(0,4)
(0,5)
(1,3)
(1,4)
(1,5)
(2,3)
(2,5)
测试2:
4
3
(0,2)
(0,3)
(2,3)
如果有改进的地方,欢迎提出来,谢谢~