Java计算图的匹配率

2016-07-02

大概意思就是这样了,代码里我貌似没有计算最后一步,但是原理都是一样的、、、、、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;
    }
}

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

时间: 2024-10-11 03:26:46

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

Dijkstra算法(三)之 Java详解

前面分别通过C和C++实现了迪杰斯特拉算法,本文介绍迪杰斯特拉算法的Java实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想

Java图片比对

import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.DecimalFormat; public class ImageDiff { //不同的像素标记为红色 public static final int RGB_RED = 16711680; /

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

目录 1 好好学习 2 埃及分数 3 金蝉素数 4 横向打印二叉树 5 危险系数 6 公式求值   1 好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学.习".但是汤姆不认识汉字,他就想胡乱地贴成一行. 请你替小汤姆算一下,他这样乱贴,恰好贴对的概率是多少? 答案是一个分数,请表示为两个整数比值的形式.例如:1/3 或 2/15 等. 如果能够约分,请输出约分后的结果. 注意:不要书写多余的空格. 请严格按照格式

Floyd算法(三)之 Java详解

前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计

Java学习(set接口、HashSet集合)

一.set接口 概念:set接口继承自Collection接口,与List接口不同的是,set接口所储存的元素是不重复的. 二.HashSet集合 概念:是set接口的实现类,由哈希表支持(实际上是一个HashMap集合).HashSet集合元素的提取顺序与存储顺序不相同. 采用哈希表数据结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法. 2.1哈希表 什么是哈希表? 链表与数组的组合. 哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

由@NotNull 注解引出的关于Java空指针的控制(转)

Java 小技巧和在java应用避免NullPonintException的最佳方法 在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法.同时,空指针也是写健壮的顺畅运行的代码的关键.“预防好过治疗”这句话也同样适用于令人不爽的NullPonintException.通过应用防御性的编码技术和在遵守多个部分之间的约定,你可以再很大程度上避免NullPointException.下面的这些java小技巧可以最小化像!=null这种检查的代码.作为