求有向圖的強連通分量的算法
阿新 • • 發佈:2017-05-09
tin 存在 有向圖 pre sys nbsp 二維 ext 定義
下面是求有向圖的強連通分量的算法的代碼:
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(intj=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
如果有不理解的可以問我哦!
求有向圖的強連通分量的算法