您的位置:首页 > 编程语言 > Java开发

java实现找出所有的最大连通子图,并把连通子图中所有顶点的集合合并为一个i额字符串集合。

2016-11-14 18:52 495 查看


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

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);//输出最大连通子图
}

}

以上代码可能存在一些冗余的部分,没有进行修改,如果需要可以自行拷贝和修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐