码迷,mamicode.com
首页 > 编程语言 > 详细

Java计算图的匹配率

时间:2016-07-02 21:25:38      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

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;
    }
}

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

 

Java计算图的匹配率

标签:

原文地址:http://www.cnblogs.com/8335IT/p/5636022.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!