zoukankan      html  css  js  c++  java
  • 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;
        }
    }

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

  • 相关阅读:
    2019.1.4函数的相关内容
    2019.1.3 序列常见的BIF
    2019.1.2字符串格式化的内容
    2018.12.29字符串的相关内容
    2018.12.28字符串的相关内容
    2018.12.27上午学习内容
    下午的学习内容
    今天上午学习的内容
    四、自动装配
    lombok
  • 原文地址:https://www.cnblogs.com/8335IT/p/5636022.html
Copyright © 2011-2022 走看看