zoukankan      html  css  js  c++  java
  • 求有向图的强连通分量的算法

    下面是求有向图的强连通分量的算法的代码:

    import java.util.Scanner;
    class Qiufenliang//定义求强连通分量的类
    {
        String lu="";//定义的一个字符型变量,记录强连通分量的路径
        public static int s=0;
        public void qiu(int a[][],int l)//定义函数,参数a为二维数组,参数l为数组的维数
        {
            int t=0;//定义int型变量,进行数量的统计
            for(int i=1;i<l;i++)
            {
                for(int j=1;j<l;j++)//进行遍历,判断每一个节点是否有路通向其他节点
                {
                    for(int m=1;m<l;m++)
                    {
                        for(int n=1;n<l;n++)
                        {
                            if(a[m][n]==-1)
                            {
                                a[m][n]=1;//将走过的路归1
                            }
                        }
                    }
                    if(a[i][j]==1)//如果是1就有通向其他节点的路
                    {
                        lu=lu+String.valueOf(i)+"--->"+String.valueOf(j)+"--->";//将这个节点加在路上
                        qiu1(a,l,i,j);//进行dfs遍历
                        lu="";
                    }
                    else//如果不是1就有通向其他节点的路,单独是一个强连通图
                    {
                        t++;
                        if(t==l-1)
                        {
                            t=0;
                            System.out.println("强连通图为:"+i);
                        }
                    }
                }
                t=0;
            }
        }
        public void qiu1(int a[][],int l,int i,int k)//dfs遍历算法中+是否有回路的算法,参数a为2维数组,l为数组的维数,i为dfs遍历时初始的节点,k为i指向的下一个节点
        {
            
            for(int m=1;m<l;m++)//从节点k进行遍历,看是否有指向其他节点的路
            {
                if(a[k][m]==1)//如果是1就存在路
                {
                    a[k][m]=-1;//将走过的路封死,不能再走
                    if(m==i)//判断是否为初始节点,如果是,就说明有回路,也就是强连通分量存在
                    {
                        System.out.println("强连通路径为:"+lu+String.valueOf(m));//输出这个强连通分量图
                    }
                    else//如果不等于初始节点,说明有指向其他节点的路,继续进行dfs遍历
                    {
            
                        lu=lu+String.valueOf(m)+"--->";
                        
                        qiu1(a,l,i,m);//递归判断下一个节点
                    }
                }
            }
            int lengh=lu.length();//如果没路则说明走不通,就往回走,
            if(lengh>0)
            {
            lu=lu.substring(0, lengh-5);//将走过的路回收
            }
        }
    }
    public class Qiang {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            int l,i,j,s;
            Qiufenliang zhao=new Qiufenliang();//定义求强连通分量的对象
            Scanner in=new Scanner(System.in);
            System.out.print("请输入顶点的个数:");
            l=in.nextInt();
            System.out.print("请输入边的个数:");
            s=in.nextInt();
            int a[][]=new int[l+1][l+1];
            for(int m=1;m<l+1;m++)
            {
                for(int n=1;n<l+1;n++)
                {
                    a[m][n]=0;
                }
            }//将2维数组全部初始化为0
            for(int k=0;k<s;k++)
            {
                System.out.print("请输入第"+(k+1)+"条边的起点和终点"+"(起点和终点必须小于等于"+l+"):");
                i=in.nextInt();
                j=in.nextInt();
                a[i][j]=1;
            }//如果有一个节点指向下一节点,则将之变为1
            for(int m=1;m<l+1;m++)
            {
                for(int n=1;n<l+1;n++)
                {
                    System.out.print(a[m][n]+"	");
                }
                System.out.println();
            }//输出这个二维数组
            zhao.qiu(a,l+1);//求强连通分量
        
        }
    
    }

    下面是一个有向图:

    可以看出强连通分量为:1---->2---->3---->5---->1     4---->5---->1---->4

    下面是另外的一个有向图:

    可以看出强连通分量为:1---->3---->4      还有一个单独的:2

    如果有不理解的可以问我哦!

  • 相关阅读:
    (转)c++中NULL与nullptr的区别
    剑指offer:面试题1:赋值运算符函数
    剑指offer开篇
    立flag
    牛客网程序员面试金典:1.2——原串翻转(java实现)
    牛客网程序员面试金典:1.1确定字符互异(java实现)
    剑指Offer:面试题34——丑数(java实现)
    剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)
    剑指Offer:面试题32——从1到n整数中1出现的次数(java实现)
    8种网站防盗链手段
  • 原文地址:https://www.cnblogs.com/zll20153246/p/6832570.html
Copyright © 2011-2022 走看看