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. PAT-甲级刷题笔记和总结

     本帖主要记录一些自己在刷题过程中的一些笔记,包括: 1.常用的函数 2.STL中常用方法 3.常见错误 4.其他常用方法 5.刷题过程中的常见算法:https://www.cnblogs.com/M ...

  2. linux 添加secondary ip

    linux下ip地址除了primary外,还有两种:1. ip alias(子接口)2. secondary ip(辅助ip) 都可在一块物理网卡上添加,alias由ifconfig添加,ifconf ...

  3. Z-tree 统计每一父节点的叶子节点数(看这一篇就够了)

    最近刚走出校园的我找到了第一份工作,在入职考核中就遇见了一道Z-tree的试题 这道题目本身是不难的,但是我第一次接触这个插件而且还把解决问题的方向搞错了,弄的我好几天都很难受. 弄得我都开始怀疑人生 ...

  4. Java 中 HashMap 初始化时赋值

      1.HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器.普通青年一般会这么初始化:HashMap<String, Strin ...

  5. 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ

    一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,RabbitM ...

  6. Spring MVC 自定义类型转换器

    新建一个自定义转换器 import org.springframework.core.convert.converter.Converter; import org.springframework.s ...

  7. Mongodb 安装 和 启动

    教程:http://www.mongodb.org.cn/tutorial/59.html 下载 >wget https://fastdl.mongodb.org/linux/mongodb-l ...

  8. npm 安装cnpm

    npm install -g cnpm --registry=https://registry.npm.taobao.org

  9. svn异常处理

    TortoiseSVN 为客户端,SUBVersion为服务器端. 1.安装的tortoiseSVN不在鼠标右键菜单栏 出现这种原因是电脑的系统和svn不符,即电脑是64位系统,而svn是32位的. ...

  10. OTS parsing error: invalid version tag woff和ttf文件被Filter拦截

    从服务器下载的字体文件放在本地,执行无法展示iconfont,浏览器控制台报出 Failed to decode downloaded font: http://127.0.0.1:8080/mhr/ ...