求有向圖的強連通分量的算法


下面是求有向圖的強連通分量的算法的代碼:

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]+"\t");
            }
            System.out.println();
        }//輸出這個二維數組
        zhao.qiu(a,l+1);//求強連通分量
    
    }

}

下面是一個有向圖:

可以看出強連通分量為:1---->2---->3---->5---->1     4---->5---->1---->4

下面是另外的一個有向圖:

可以看出強連通分量為:1---->3---->4      還有一個單獨的:2

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM