算法介绍:
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("该有向图不是有向欧拉图");
}
}
}