Java计算图的匹配率

大概意思就是这样了,代码里我貌似没有计算最后一步,但是原理都是一样的、、、、、R1有5个点P1有四个点,他们共同的点是4个,那就是共同点4*4/(R1的5个点*P1的四个点就是0.8啦)
我这个代码又一个投机取巧的地方,就是你算两个图的最大共有连通子图的时候,不单单要两个图都有这些点,这些点所连接得边其实也是必须一样,我这里就是找有公共的点但是这些点连接的边是否都有我并没考虑。。。。。。。。
1 import java.text.DecimalFormat;
2 import java.util.ArrayList;
3 import java.util.Arrays;
4 import java.util.Scanner;
5
6 public class catchmain {
7 void initgraph(int a,catchrate []pis)
8 {
9 for(int z=1;z<=a;z++)
10
11 {
12
13 System.out.println("请输入该组第"+z+"个图的节点数:");
14 Scanner cinn=new Scanner(System.in);
15 int n,e;//分别代表结点个数和边的数
16 n=cinn.nextInt();
17 System.out.println("请输入该组第"+z+"个图的起始点char型表示:");
18 Scanner cinn2=new Scanner(System.in);
19 String str=cinn2.next();
20 //String labels[]=new String[n];//结点的标识
21 catchrate graph=new catchrate(n);
22 // pis[z-1]=graph;
23
24 for(int i=0;i<n;i++) {
25 char sss=(char)(str.charAt(0)+i);
26
27 graph.insertVertex(sss);//插入结点
28 }
29 //插入e条边
30 System.out.println("请输入该组第"+z+"个图的边数:");
31 Scanner cinn3=new Scanner(System.in);
32 e=cinn3.nextInt();
33 for(int aa=0;aa<e;aa++)
34 {
35 System.out.println("from:");
36 Scanner top=new Scanner(System.in);
37 System.out.println("to:");
38 Scanner bottom=new Scanner(System.in);
39 graph.insertEdge(top.nextInt()-1, bottom.nextInt()-1, 1);
40 }
41
42 System.out.println("结点个数是:"+graph.getNumOfVertex());
43 System.out.println("边的个数是:"+graph.getNumOfEdges());
44 pis[z-1]=graph;
45 }
46
47
48 }
49 public Object clone()
50 {
51 Object o=null;
52 try
53 {
54 o=(ArrayList)super.clone();//Object 中的clone()识别出你要复制的是哪一个对象。
55 }
56 catch(CloneNotSupportedException e)
57 {
58 System.out.println(e.toString());
59 }
60 return o;
61 }
62 int Jiao(ArrayList A,ArrayList B)
63 {
64 ArrayList temp=new ArrayList(A.size());
65
66 temp=(ArrayList) A.clone();
67 //System.out.print(A.size()+",,,"+temp.size());
68 temp.retainAll(B);
69 //System.out.println(temp);
70 //System.out.print(A.size()+",,,"+temp.size());
71 return temp.size();
72 }
73 public static void main(String args[]) {
74 catchmain A=new catchmain();
75
76 System.out.print("第一组图的个数:");
77 Scanner cin=new Scanner(System.in);
78 int numgraph=cin.nextInt();
79
80 catchrate pis1[]=new catchrate[numgraph];
81 A.initgraph(numgraph,pis1);
82
83 //............................................
84 System.out.print("第2组图的个数:");
85 Scanner con=new Scanner(System.in);
86 int numg2=cin.nextInt();
87
88 catchrate pis2[]=new catchrate[numg2];
89 A.initgraph(numg2,pis2);
90
91 //取两个图的交集retainall、、边的交集也要比对是否存在,这里为了方便假设点交集中所有的连接边
92 //在R中有的边在p中也都有,免去边求交集的步骤。
93 for(int i=0;i<numgraph;i++)
94 {
95 for(int j=0;j<numg2;j++)
96 {
97 int result=A.Jiao(pis1[i].getarraylist(),pis2[j].getarraylist());
98 System.out.println("公共节点数:"+result);
99 System.out.println("num of node everygraph:"+pis1[i].getarraylist().size()+"....."+pis2[j].getarraylist().size());
100 int fenmu=(pis1[i].getarraylist().size())*(pis2[j].getarraylist().size());
101 float rate=(float)(result*result)/(fenmu);
102 float b = (float)(Math.round(rate*100))/100;
103 System.out.println("第一组"+(i+1)+"图和第二组"+(j+1)+"图的匹配率为"+b);
104 }
105 }
106
107 }
108 }
import java.util.ArrayList;
import java.util.LinkedList;
/**
* @description 邻接矩阵模型类
* @author beanlam
* @time 2015.4.17
*/
public class catchrate {
private ArrayList vertexList;//存储点的链表
private int[][] edges;//邻接矩阵,用来存储边
private int numOfEdges;//边的数目
public catchrate(int n) {
//初始化矩阵,一维数组,和边的数目
edges=new int[n][n];
vertexList=new ArrayList(n);
numOfEdges=0;
}
public ArrayList getarraylist()
{
return vertexList;
}
//得到结点的个数
public int getNumOfVertex() {
return vertexList.size();
}
//得到边的数目
public int getNumOfEdges() {
return numOfEdges;
}
//返回结点i的数据
public Object getValueByIndex(int i) {
return vertexList.get(i);
}
//返回v1,v2的权值
public int getWeight(int v1,int v2) {
return edges[v1][v2];
}
//插入结点
public void insertVertex(Object vertex) {
vertexList.add(vertexList.size(),vertex);
}
//插入边
public void insertEdge(int v1,int v2,int weight) {
edges[v1][v2]=weight;
edges[v2][v1]=weight;
numOfEdges++;
}
//删除边
public void deleteEdge(int v1,int v2) {
edges[v1][v2]=0;
numOfEdges--;
}
//得到第一个邻接结点的下标
public int getFirstNeighbor(int index) {
for(int j=0;j<vertexList.size();j++) {
if (edges[index][j]>0) {
return j;
}
}
return -1;
}
//根据前一个邻接结点的下标来取得下一个邻接结点
public int getNextNeighbor(int v1,int v2) {
for (int j=v2+1;j<vertexList.size();j++) {
if (edges[v1][j]>0) {
return j;
}
}
return -1;
}
}
这个代码是自己输入图图的顶点图得边以及每个组有几个图,我没有仔细试试,估计错误会有很多,网批评指正吧。

浙公网安备 33010602011771号