NJUPTN南邮 | 离散数学_实验四

内容:
对具有n个结点的无向图,判断其能否被一笔画。
要求:
对给定n个结点的无向图,进行欧拉图和半欧拉图的判定,若是欧拉图或半欧拉图,则输出所有的欧拉(回)路。

package exp04;

import java.util.Stack;

class Graph {
    int[][] matrix;     // 图的邻接矩阵
    int n;      // 顶点个数
    boolean[] visted;  //标记点是否被访问
    Stack<Integer> s=new Stack();       // 堆栈
    int[] ans=new int[50];
    int count = 0;  //记录欧拉路的路径,路径数

    public Graph(int[][] matrix, int n) {
        this.matrix = matrix;
        this.n = n;
        visted = new boolean[n];
        for (boolean v: visted) {
            v=false;
        }
    }

    //从所设定的起点深度优先遍历图,若有一个点没被访问,则为非连通图
    public boolean Judge()
    {
        DFS(0);
        for(int i = 0; i < n; i++)
            if(!visted[i])
                return false;
        return true;
    }

    //深度优先搜索
    private void DFS(int x)
    {
        visted[x] = true;
        for(int i = 0; i < n; i++)
            if(!visted[i] && matrix[x][i]==1)
                DFS(i);
    }

    public void JudgeEuler(){
        int degree,start=0,num=0;
        for(int i = 0; i < n; i++)      // 如果存在奇度顶点,则从奇度顶点出发,否则从0出发
        {
            degree = 0;
            for(int j = 0; j < n; j++)
                degree += matrix[i][j];
            if(degree % 2!=0)
            {
                start = i;
                num++;
            }
        }
        // 无向图具有一条欧拉路,当且仅当G是连通的,且有0个或2个奇数度结点
        if(num == 0 || num == 2)
        {
            Fleury(start);
            //欧拉路径的头和尾相等,则说明欧拉路是回路
            if(ans[0] == ans[count - 1])
                System.out.println("该图是欧拉图,欧拉回路为:");
            else
                System.out.println("该图是半欧拉图,欧拉路为:");
            Answer();
        }
        else
            System.out.println("该图不是欧拉图或半欧拉图");

    }

    private void Answer() {
        for(int i = 0; i < count; i++)
            System.out.print(ans[i]+" ");
        System.out.println();
    }

    private void Fleury(int x) {
        int flag;
        s.push(x);
        while(!s.isEmpty())
        {
            flag = 0;
            for(int i = 0; i < n; i++)
            {
                if(matrix[s.lastElement()][i] > 0)
                {
                    flag = 1;
                    break;
                }
            }
            if(flag == 0)  //如果没有可扩展的点,则记录下该点并将其出栈
            {
                ans[count ++] = s.pop() + 1;
            }
            else  //如果有,则将其出栈并继续搜索
            {
                DFSGraph(s.pop());
            }
        }
    }

    private void DFSGraph(int x)
    {
        s.push(x);
        for(int i = 0; i < n; i++)
        {
            if(matrix[i][x] > 0)
            {
                matrix[i][x] = 0;  //删除该边
                matrix[x][i] = 0;
                DFSGraph(i);
                break;
            }
        }
    }
}


package exp04;

import java.awt.*;
import java.util.Scanner;

public class Test04 {
    public static void main(String[] args) {
        System.out.println("请输入无向图节点个数:");
        Scanner input = new Scanner(System.in);
        int n=input.nextInt();     // 无向图节点个数
        System.out.println("请输入所需判定的无向图邻接矩阵:");
        int[][] matrix=new int[n][n];

        System.out.print(" ");
        for (int i = 1; i <=n; i++) {
            System.out.print(" "+i);
        }
        System.out.println();

        for (int i = 0; i < n; i++) {       // 输入图的邻接矩阵
            System.out.print(i+1);
            for (int j = 0; j < n; j++) {
                matrix[i][j]=input.nextInt();
            }
        }
        Graph g = new Graph(matrix,n);
        System.out.println(g.Judge()?"此图为连通图":"此图为非连通图");
        if (g.Judge()==false)       // 如果是非连通图,不需要进一步判断
            return;
        g.JudgeEuler();
    }
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值