2016-07-02

大概意思就是这样了,代码里我貌似没有计算最后一步,但是原理都是一样的、、、、、R1有5个点P1有四个点,他们共同的点是4个,那就是共同点4*4/(R1的5个点*P1的四个点就是0.8啦)

我这个代码又一个投机取巧的地方,就是你算两个图的最大共有连通子图的时候,不单单要两个图都有这些点,这些点所连接得边其实也是必须一样,我这里就是找有公共的点但是这些点连接的边是否都有我并没考虑。。。。。。。。

 import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner; public class catchmain {
void initgraph(int a,catchrate []pis)
{
for(int z=1;z<=a;z++) { System.out.println("请输入该组第"+z+"个图的节点数:");
Scanner cinn=new Scanner(System.in);
int n,e;//分别代表结点个数和边的数
n=cinn.nextInt();
System.out.println("请输入该组第"+z+"个图的起始点char型表示:");
Scanner cinn2=new Scanner(System.in);
String str=cinn2.next();
//String labels[]=new String[n];//结点的标识
catchrate graph=new catchrate(n);
// pis[z-1]=graph; for(int i=0;i<n;i++) {
char sss=(char)(str.charAt(0)+i); graph.insertVertex(sss);//插入结点
}
//插入e条边
System.out.println("请输入该组第"+z+"个图的边数:");
Scanner cinn3=new Scanner(System.in);
e=cinn3.nextInt();
for(int aa=0;aa<e;aa++)
{
System.out.println("from:");
Scanner top=new Scanner(System.in);
System.out.println("to:");
Scanner bottom=new Scanner(System.in);
graph.insertEdge(top.nextInt()-1, bottom.nextInt()-1, 1);
} System.out.println("结点个数是:"+graph.getNumOfVertex());
System.out.println("边的个数是:"+graph.getNumOfEdges());
pis[z-1]=graph;
} }
public Object clone()
{
Object o=null;
try
{
o=(ArrayList)super.clone();//Object 中的clone()识别出你要复制的是哪一个对象。
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
int Jiao(ArrayList A,ArrayList B)
{
ArrayList temp=new ArrayList(A.size()); temp=(ArrayList) A.clone();
//System.out.print(A.size()+",,,"+temp.size());
temp.retainAll(B);
//System.out.println(temp);
//System.out.print(A.size()+",,,"+temp.size());
return temp.size();
}
public static void main(String args[]) {
catchmain A=new catchmain(); System.out.print("第一组图的个数:");
Scanner cin=new Scanner(System.in);
int numgraph=cin.nextInt(); catchrate pis1[]=new catchrate[numgraph];
A.initgraph(numgraph,pis1); //............................................
System.out.print("第2组图的个数:");
Scanner con=new Scanner(System.in);
int numg2=cin.nextInt(); catchrate pis2[]=new catchrate[numg2];
A.initgraph(numg2,pis2); //取两个图的交集retainall、、边的交集也要比对是否存在,这里为了方便假设点交集中所有的连接边
//在R中有的边在p中也都有,免去边求交集的步骤。
for(int i=0;i<numgraph;i++)
{
for(int j=0;j<numg2;j++)
{
int result=A.Jiao(pis1[i].getarraylist(),pis2[j].getarraylist());
System.out.println("公共节点数:"+result);
System.out.println("num of node everygraph:"+pis1[i].getarraylist().size()+"....."+pis2[j].getarraylist().size());
int fenmu=(pis1[i].getarraylist().size())*(pis2[j].getarraylist().size());
float rate=(float)(result*result)/(fenmu);
float b = (float)(Math.round(rate*100))/100;
System.out.println("第一组"+(i+1)+"图和第二组"+(j+1)+"图的匹配率为"+b);
}
} }
}
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;
}
}

这个代码是自己输入图图的顶点图得边以及每个组有几个图,我没有仔细试试,估计错误会有很多,网批评指正吧。

Java计算图的匹配率的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. Floyd算法(三)之 Java详解

    前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明 ...

  3. 【转】java开源类库pinyin4j的使用

    最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字), 呵呵,看了看他的demo,决定就用它了,因为我在实际使 ...

  4. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

  5. Dijkstra算法之 Java详解

    转载:http://www.cnblogs.com/skywang12345/ 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主 ...

  6. Java图片比对

    在自动化测试中,除了普通的值验证,经常还有一些图片验证,比如图片的匹配率,输出图片的差异图片等.本文主要用到了BufferedImage类来操作图片比对和输出差异图片,大体的思路如下: 1. 通过Im ...

  7. 20172302 《Java软件结构与数据结构》第九周学习总结

    2018年学习总结博客总目录:第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 教材学习内容总结 第十五章 图 1.图:图(graph)是由一些点(vertex)和这些点之间的连 ...

  8. Fork/Join 框架-设计与实现(翻译自论文《A Java Fork/Join Framework》原作者 Doug Lea)

    作者简介 Dong Lea任职于纽约州立大学奥斯威戈分校(State University of New York at Oswego),他发布了第一个广泛使用的java collections框架实 ...

  9. 算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)

    目录 1 好好学习 2 埃及分数 3 金蝉素数 4 横向打印二叉树 5 危险系数 6 公式求值   前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的 ...

随机推荐

  1. 1035 Password (20 分)

    1035 Password (20 分) To prepare for PAT, the judge sometimes has to generate random passwords for th ...

  2. OPatch failed with error code 73(OracleHomeInventory gets null oracleHomeInfo)

    OPatch failed with error code 73(OracleHomeInventory gets null oracleHomeInfo) 1.问题描述 [oracle@dou_ra ...

  3. Python3 os模块应用

    调用模块的实质是运行python代码,比如a.py文件里有函数f(),那么你在调用a模块的时候,实质是运行了a模块里的函数f(),这个时候内存里就有这个函数了,可以直接用,那是不是随便一个py类型的文 ...

  4. python学习之RabbitMQ-----消息队列

    RabbitMQ队列 首先我们在讲rabbitMQ之前我们要说一下python里的queue:二者干的事情是一样的,都是队列,用于传递消息 在python的queue中有两个一个是线程queue,一个 ...

  5. 异常信息ASM ClassReader failed to parse class file的问题解决

    jdk8与spring 3不兼容问题:用jdk7.或者升级到spring4 详情:异常信息ASM ClassReader failed to parse class file的问题解决

  6. mysql数据库复制

    核心命令是 myssqldump mysqldump --host=host1 --opt sourceDb| mysql --host=host2 -C targetDb 详情参考: MySQL数据 ...

  7. datasnap 如何监控客户端的连接情况

    如果客户端是TCP/IP是短连接的情况就没有必要了. type pClientConns = ^TClientConns; // 客户连接 TClientConns = record clientid ...

  8. FireFox 火狐主页被劫持

    火狐主页被劫持hao123,流氓 WIN7 ,firefox,任务栏,快速启动,右键 属性 target 应该是 "D:\Program Files (x86)\Mozilla Firefo ...

  9. Angularjs 首次加载显示{{}}

    使用如下标签 <span translate="{{'SYSTEM_100001'|translateFilter}}"></span>

  10. fb 更新sdk

    flash兼容flex.fb的sdk,但fb不一定兼容flash的sdk,那么直接将flash的sdk解压覆盖掉fb的sdk,就可以打开了. fb更新sdk方法: 1.找到(安装目录+eclipse\ ...