VF3用c语言实现

时间: 2023-10-22 08:06:26 浏览: 35
VF3是一种用于解决子图同构问题的算法。由于其效率高、实现简单,因此被广泛应用于图像识别、化学分子结构比对等领域。以下是一个用C语言实现的VF3算法的示例代码: ``` #include <stdio.h> #include <stdlib.h> #define MAXN 1000 #define MAXM 100000 int n1, n2, m1, m2, m; int head1[MAXN], head2[MAXN], to1[MAXM], to2[MAXM], nxt1[MAXM], nxt2[MAXM]; int match[MAXN], f[MAXN], g[MAXN], stk[MAXN]; int cnt; void add_edge(int head[], int to[], int nxt[], int u, int v) { to[cnt] = v, nxt[cnt] = head[u], head[u] = cnt++; } int dfs(int p, int q, int depth) { if (depth > n2) return 1; int u = to2[p]; for (int i = head1[u]; i != -1; i = nxt1[i]) { int v = to1[i]; if (f[v] == q) { f[v] = 0; if (dfs(match[v], q, depth + 1)) { match[v] = u; return 1; } f[v] = q; } } return 0; } void vf3(int depth) { if (depth > n1) return; int min_deg = n2 + 1, u = 0; for (int i = 0; i < n1; i++) { if (!g[i]) { int deg = 0; for (int j = head1[i]; j != -1; j = nxt1[j]) { int v = to1[j]; if (!g[v]) deg++; } if (deg < min_deg) { min_deg = deg; u = i; } } } if (min_deg == n2 + 1) return; for (int i = head1[u]; i != -1; i = nxt1[i]) { int v = to1[i]; if (!g[v]) { g[v] = 1; for (int j = head2[match[v]]; j != -1; j = nxt2[j]) { int w = to2[j]; if (f[w] && dfs(head2[match[v]], f[w], 1)) { match[v] = w; break; } } vf3(depth + 1); g[v] = 0; match[v] = -1; for (int j = 0; j < cnt; j += 2) { if (to1[j] == u && to2[j + 1] == v) match[v] = to2[j]; } } } } int main() { scanf("%d%d%d", &n1, &m1, &n2); for (int i = 0; i < n1; i++) head1[i] = -1; for (int i = 0; i < n2; i++) head2[i] = -1; cnt = 0; for (int i = 0; i < m1; i++) { int u, v; scanf("%d%d", &u, &v); add_edge(head1, to1, nxt1, u, v); } scanf("%d", &m2); for (int i = 0; i < m2; i++) { int u, v; scanf("%d%d", &u, &v); add_edge(head2, to2, nxt2, u, v); } for (int i = 0; i < n1; i++) match[i] = -1; for (int i = 0; i < n2; i++) f[i] = i + 1; vf3(1); int ans = 0; for (int i = 0; i < n1; i++) { if (match[i] != -1) { ans++; stk[match[i]] = i; } } printf("%d\n", ans); for (int i = 0; i < n2; i++) { if (stk[i]) printf("%d %d\n", stk[i], i); } return 0; } ``` 以上代码实现了VF3算法的主要部分,输入的格式为: ``` n1 m1 n2 u1 v1 u2 v2 ... m2 u1 v1 u2 v2 ... ``` 其中n1表示第一个图的节点数,m1表示第一个图的边数,n2表示第二个图的节点数,m2表示第二个图的边数。接下来m1行每行两个整数表示第一个图的一条边。接下来m2行每行两个整数表示第二个图的一条边。输出格式为: ``` k u1 v1 u2 v2 ... ``` 其中k表示匹配的边数,接下来k行每行两个整数表示匹配的边。

相关推荐

最新推荐

recommend-type

模电课设报告(线性VF电压频率转换).doc

模拟电路的课程设计报告,设计内容为 线性VF转换(电压频率转换),内附详细的设计思路及各个模块的详细电路图。
recommend-type

利用vf转换器实现AD转换电路

利用VF实现AD转换电路。电路价格低廉,外围电路简单, 适合应用在转换速度不太高的场合应用.本文包括硬件电路和软件程序的实现. 关键词:A/D转换器,V/F转换器, 高精度.
recommend-type

u-boot中使s3c2410支持SST39VF1601

本资料是基于广州华天正科技有限公司的realarm2410开发板,对其他使用SST39VF1601的2410开发板应该也是可以支持的,我移植的U-boot 是1.1.6版
recommend-type

在Visual Foxpro编程中通过VF日历控件,VF日期插件,VF日期控件实现日期输入

在Visual Foxpro编程中通过VF日历控件,VF日期插件,VF日期控件实现日期输入
recommend-type

vf课程设计实验报告模板

vf课程设计实验报告模板,最标准的优秀模板,希望能够给大家带来些许帮助。
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLO目标检测算法的挑战与机遇:数据质量、计算资源与算法优化,探索未来发展方向

![:YOLO目标检测算法的挑战与机遇:数据质量、计算资源与算法优化,探索未来发展方向](https://img-blog.csdnimg.cn/7e3d12895feb4651b9748135c91e0f1a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKJ6YaJ77yM5LqO6aOO5Lit,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. YOLO目标检测算法简介 YOLO(You Only Look Once)是一种
recommend-type

def ObjFun(x,y,beta): # 目标函数 """ Logistic regression loss function :param beta: model parameter vector :param x: feature matrix :param y: label vector :return: loss value """ n = x.shape[0] p = x.shape[1] pred = 1 / (1 + np.exp(-np.dot(x, beta))) pred = np.clip(pred, 1e-15, 1 - 1e-15) # 将预测值限制在一个很小的区间内 ObjVal = -np.sum(y * np.log(pred) + (1 - y) * np.log(1 - pred)) / n return ObjVal

好的,根据上面的目标函数,我们可以推导出其对应的梯度向量函数,如下所示: def gradient(x, y, beta): """ Compute gradient of the logistic regression loss function :param beta: model parameter vector :param x: feature matrix :param y: label vector :return: gradient vector """ n = x.shape[0] pred = 1 /
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。