Java实现判断一个有向图是不是有向欧拉图

算法介绍:

java代码实现:

package sy5;

import java.util.Scanner;

import sy3.*;
import sy4.*;

//判断一个有向图是否是有向欧拉图
public class IsEulerDigra {
	public final static int Inf=Integer.MAX_VALUE;//表示整型无穷大,用来标识两个顶点是否有边相连
	public boolean Flag=true;
	public Vnode V[];//顶点集
	public int A[][];//邻接矩阵
	BellmanFord B;//最短路径算法
	
	public IsEulerDigra(Vnode V[],int A[][]){
		this.A=A;
		this.V=V;
		B=new BellmanFord(A,V);
	}
	
	//判断一个有向图是不是强连通的
	public boolean IsStrongConnected(String Vs) throws Exception{
		boolean flag=true;
		boolean flag1=true;
		boolean flag2=true;
		int index=0;
		for(int i=0;i<V.length;i++){
			if(V[i].getV().equals(Vs)){
				index=i;
			}
		}
		//判断是否存在关于Vs的圈
		//寻找第一个顶点到所有点的最短路径
		for(int i=0;i<V.length && i!=index;i++){
			B.Path(Vs, V[i].getV());//寻找第一个顶点到第i个顶点的最短路径
			if(!B.flag){
				flag1=false;
				//System.out.println("flag1="+flag1);
				break;
			}
		}
		for(int i=0;i<V.length && i!=index;i++){
			B.Path(V[i].getV(), Vs);//寻找第i个顶点到第1个顶点的最短路径
			if(!B.flag){
				flag2=false;
				//System.out.println("flag2="+flag2);
				break;
			}
		}
		if(flag1 && flag2 && HadCircle(Vs)){
			flag=true;
		}else{
			flag=false;
		}
		//System.out.println("flag="+flag);
		return flag;
	}
	//判断一个有向图中每个顶点的出度是否都等于入度
	public boolean IndIsEqualOutd(){
		boolean flag=true;
		int in[]=new int[V.length];//入度
		int out[]=new int[V.length];//出度
		for(int i=0;i<V.length;i++){
			for(int j=0;j<V.length;j++){
				if(A[i][j]!=Inf){//如果有出去的边
					out[i]++;//出度加1
				}
				if(A[j][i]!=Inf){//如果
					in[i]++;//入度加1
				}
			}
		}
		for(int i=0;i<V.length;i++){
			if(in[i]!=out[i]){
				flag=false;
				break;
			}
		}
		//System.out.println("每个顶点的出度都等于入度!"+flag);
		return flag;
	}
	//判断有没有从第一个顶点到第一个顶点间的有向圈
	public boolean HadCircle(String v) throws Exception{
		boolean flag=true;//用来判断是否存在v---->v的路
		B.ZX(v);
		Vnode X[]=B.X;
		int index=0;
		for(int i=0;i<V.length;i++){
			if(V[i].getV().equals(v)){
				index=i;
			}
		}
		if(A[index][index]==Inf){
			for(int i=0;i<X.length;i++){
				//System.out.println("X的长度"+"   "+X.length);
				B.Path(X[i].getV(), v);
				//System.out.println(X[i].getV()+"   "+B.flag);
				if(B.flag==false){
					flag=false;
					//System.out.println("Flag1="+flag);
					break;
				}
			}
		}else{
			flag=false;
			System.out.println("Flag2="+flag);
		}
		return flag;
	}
	public static void main(String args[]) throws Exception{
		boolean flag1=true;
		boolean flag2=true;
		MyGraph G=new MyGraph();
		G.createGraph();
		System.out.println("请输出所构建图的邻接矩阵:");
		for(int i=-1;i<G.getVexNum();i++){
			if(i<0){
				System.out.print("          ");
				for(int j=0;j<G.getVexNum();j++){
					System.out.print(G.getVex(j)+"         ");
				}
				System.out.println();
			}else{
				for(int j=-1;j<G.getVexNum();j++){
					if(j<0){
						System.out.print(G.getVex(i)+"         ");
					}
					else{
                         if(G.arcs[i][j]==Inf){
                        	 System.out.print("INF"+"         ");
						}
                         else{
                        	 System.out.print(G.arcs[i][j]+"         ");	
                         }					
					}//else
				}// if
				System.out.println();
			}// for
		}//else
		Scanner s=new Scanner(System.in);
		System.out.println("请输入固定点:");
		String vs=s.next();
		IsEulerDigra ED=new IsEulerDigra(G.V,G.arcs);
		flag1=ED.IsStrongConnected(vs);
		flag2=ED.IndIsEqualOutd();
		if(flag1 && flag2){
			System.out.println("该有向图是有向欧拉图");
		}else{
			System.out.println("该有向图不是有向欧拉图");
		}
	}
}


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值