java實現找出所有的最大連通子圖,並把連通子圖中所有頂點的集合合併爲一個i額字符串集合。

********************************************************************************************************

IntersectionOfWord類,代碼如下:

package Intersection;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class IntersectionOfWord {

	public ArrayList<ArrayList<String>> ReadData(String fileName) throws FileNotFoundException{
		//////讀取文件到一個集合類中
		ArrayList<ArrayList<String>> k = new ArrayList<ArrayList<String>>();
		try {
			BufferedReader reader = new BufferedReader(new FileReader(fileName));
			String line = null;
	        while((line=reader.readLine())!=null){
	        	ArrayList<String> tm = new ArrayList<String>();
	        	line = line.toLowerCase();
	        	String str[] = line.split("\\s+");
	        	for(int i = 0; i<str.length; i++){
	        		String word = str[i].trim();
	        		tm.add(word);
	        	}
	        	k.add(tm);
	        }
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}
		return k;
	}
	public int[][] Graph(ArrayList<ArrayList<String>> data){
		///////計算交集,構建一個鄰接矩陣到一個二位數組中
		int[][] kk=new int[data.size()][data.size()];
		for(int i=0;i<data.size()-1;i++){
			//讀到倒數第二個,以爲最後一個沒有比較對象了
			float jj=(float) 0.0;
			for(int j=i+1;j<data.size();j++){
				for(int k=0;k<data.get(j).size();k++){
					if(data.get(i).contains(data.get(j).get(k))){
						jj++;
					}
				}
				if((jj*jj)/(float)(data.get(i).size()*data.get(j).size())>=0.6){
					//判斷是否重疊度>=0.6
					kk[i][j]=1;
					kk[j][i]=1;
				}
			}
		}
		return kk;
	}
}
Merge類,代碼如下:

package Intersection;

import java.util.ArrayList;

public class Merge {
	 public ArrayList <ArrayList<String>> merge(ArrayList<Integer> list,ArrayList<ArrayList<String>> data){
		 //合併最大連通子圖
		 ArrayList <ArrayList<String>> mergeResult = new ArrayList <ArrayList<String>>();
		 for(int i=0;i<list.size();i++){
			 mergeResult.add(data.get((int)list.get(i)));
		 }
		 return  mergeResult;
	 }
	 public void OutPrint(ArrayList <ArrayList<String>> merge){
		 //輸出合併後的最大連通子圖
		 for(int i=0;i<merge.size();i++){
				ArrayList<String> al=merge.get(i);
				for(int j=0;j<al.size();j++){
					System.out.print(al.get(j)+" ");
				}
				System.out.println();
			}
	 }
}
Traverse類,代碼如下:

package Intersection;

import java.util.ArrayList;
import java.util.List;

public class Traverse {
	private boolean []visited;//設置節點是否訪問過
	public  ArrayList<Integer> DFSTraverse(int[][]a,ArrayList<ArrayList<String>> data){
		/////////深度優先遍歷,並且返回一個最大聯通子圖
		 int deep=0;//深度
		 ArrayList<Integer> max_graph=null;//最大連通子圖
		 visited= new boolean[data.size()];
		
		 for(int i=0;i<data.size();i++) visited[i]=false;
		 for(int i=0;i<data.size();i++) {
			 if(!visited[i]) {
				 ArrayList<Integer> b=new ArrayList<Integer>();
				 DFS(a,i,b,data);
				 //不斷更新遍歷的長度,記錄長度最大的一次遍歷,即最大連通子圖!
				 if(b.size()>deep){
					 deep=b.size();
					 max_graph=b;
				 }
			 }
			 
		 }
		 return max_graph;
	 }
	 
	 public void DFS(int[][]a,int v,List b,ArrayList<ArrayList<String>> data){
		 int w;
		 visited[v]=true;
	     b.add(v);
		 //System.out.println("訪問第"+v+"個點");
		 w=firstAdjvex(a,v,data);
		 while(w>=0){
			 if(!visited[w]) DFS(a,w,b,data);
			  w=nextAdjvex(a,v,data);
		 }

	 }
	 
	 public int firstAdjvex(int[][]a,int v,ArrayList<ArrayList<String>> data){
		 for(int i=0;i<data.size();i++){
			 if(a[v][i]!=0)
				 return i;
		 }
		 return -1;
	 }
	 public int nextAdjvex(int[][]a,int v,ArrayList<ArrayList<String>> data){
		 for(int i=0;i<data.size();i++){
			 if(a[v][i]!=0&&!visited[i])
				 return i;
		 }
		 return -1;
	 }
	 public void OutPrint(ArrayList<Integer> MaxGraph){
		 //輸出最大連通子圖的各個節點
		 for(int i=0;i<MaxGraph.size();i++){
				System.out.print(MaxGraph.get(i)+"\t");
				if((i+1)%10==0)
				{
					System.out.println();
				}
			}
	 }
}
Main類,代碼如下:

package Intersection;

import java.io.FileNotFoundException;
import java.util.ArrayList;

public class Main {

	/**
	 * @param args
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException {
		// TODO Auto-generated method stub
		String fileName="data/mips.txt";
		IntersectionOfWord rd=new IntersectionOfWord();
		ArrayList<ArrayList<String>> arr=new ArrayList<ArrayList<String>>();
		int[][] graph;
		arr=rd.ReadData(fileName);//讀取數據到一個集合類中
		graph=rd.Graph(arr);//求交集後並且求出鄰接矩陣
		ArrayList<Integer> MaxGraph=new ArrayList<Integer>();
		Traverse tv=new Traverse();
		MaxGraph=tv.DFSTraverse(graph, arr);//深度優先遍歷求最大連通子圖
		System.out.println("====輸出最大連通子圖的點====");
		tv.OutPrint(MaxGraph);//輸出最大連通子圖
		System.out.println();
		ArrayList <ArrayList<String>> merge=new ArrayList <ArrayList<String>>();
		Merge mm=new Merge();
		merge=mm.merge(MaxGraph, arr);//合併最大連通子圖
		System.out.println("====輸出最大連通子圖的值====");
		mm.OutPrint(merge);//輸出最大連通子圖
	}

}

以上代碼可能存在一些冗餘的部分,沒有進行修改,如果需要可以自行拷貝和修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章