上一篇关于VF2的博客写的太水了,http://blog.youkuaiyun.com/mmc2015/article/details/49777447。而且错误百出。
至于VF2思想,看原论文吧。
1)数据结构:
//每个邻接边的结构,注意,该结构不单独使用,必须和某个点一起使用
struct EDGE
{
int id2; //边的另一端的点的id
int id2Label; //注意,两条边一样,除了该边上的label一样,还要另一端的节点的label(注意不是id,所以才加了这个变量)也一样
int label; //边上的label
};
struct NODE
{
int id;
int label;
int edgeNumber; //邻接的边有多少条
vector<EDGE> adjacencyEdgeSet; //邻接的边
};
//邻接链表结构,不过是用vector来实现
struct GRAPH
{
int graphID;
vector<NODE> nodeSet;
};
2)读数据:
vector<GRAPH *> ReadGraph(const char *filename)
{
FILE *fp = fopen(filename, "r");
/*
if (!fp)
{
printf("fp is NULL, file [%s] doesn't exist...\n", filename);
return NULL;
}
*/
char mark[2];
int id,label,id2;
NODE node;
EDGE edge;
vector<GRAPH *> gSet;
GRAPH * g = NULL;
while(true)
{
fscanf(fp, "%s", mark);
if(mark[0]=='t')
{
fscanf(fp, "%s%d", mark, &id);
if(id==-1)
{
int i,s=g->nodeSet.size(),j,eN;
for(i=0;i<s;++i)
{
eN=g->nodeSet[i].adjacencyEdgeSet.size(); //计算最后一个graph中每个node的邻接边的个数
g->nodeSet[i].edgeNumber=eN;
for(j=0;j<eN;++j) //找到每一个id2对应的id2Label
{
g->nodeSet[i].adjacencyEdgeSet[j].id2Label=g->nodeSet[g->nodeSet[i].adjacencyEdgeSet[j].id2].label