离散实验4:无向简单图的最大匹配

实验题目:

无向简单图的最大匹配。

实验目的:

  1. 掌握最大匹配,交错路径的定义;
  2. 掌握最大匹配的求解方法。

实验要求:

输入: 无向简单连通图的关联矩阵。
输出: 此图的任意一个最大匹配及匹配数(例如:M={e1,e3},β1=2)。
说明: 要求学生设计的程序不仅对给定非负整数序列得出正确结果,还要对教师测试数据集得出正确结果,编程语言不限。

流程图:

源代码:

include

include

include

include

include

include

using namespace std;

const int N = 100;//最大顶点数
const int M = 100;//最大边数
int n;//顶点数
int m;//边数
int Matrix[N][M];//关联矩阵

//先利用集合可去重的特性找处所有极大匹配,然后找出最大匹配并输出
void getMatch() {
//找所有极大匹配
set<set> matchings;//存放所有极大匹配
for (int i = 0; i < m; i++) {
set matching;//临时存放匹配
set vertex;
matching.insert(i);//从第一条边开始遍历
for (int j = 0; j < n; j++) {
if(Matrix[j][i] == 1){
vertex.insert(j);
}
}
for (int j = 0; j < m; j++) {
int v[2] = {-1};///v[0]和v[1]分别储存一条边关联的两个顶点
int cnt = 0;
for (int k = 0; k < n; k++) {//判断两条边是否相邻
if (Matrix[k][j] == 1 && vertex.count(k) == 0) {//如果该顶点为非饱和点则记录一下
v[cnt] = k;
cnt++;
}
}
if (cnt == 2) {//如果cnt=2则表明这条边关联的两个顶点均为非饱和点
matching.insert(j);//这条边可以加入匹配集合中
vertex.insert(v[0]);//加入顶点用于后续判断
vertex.insert(v[1]);
}
}
matchings.insert(matching);
}
//找最大匹配
set maxMatching;
int b = 0;
for (auto it = matchings.begin(); it != matchings.end(); it++) {
int n = it->size();
if (n > b) {
b = n;
maxMatching.clear();
maxMatching = *it;
}
}
cout << "此图的一个最大匹配: M = {";
int cnt = 0;
for (auto it = maxMatching.begin(); it != maxMatching.end(); it++) {
cout << "e" << *it + 1;
cnt++;
if (cnt == b) {
cout << "}" << endl;
} else {
cout << ", ";
}
}
cout << "匹配数: β1 = " << b << endl;
}

void berge() {

}

int main() {
m = 0;
n = 0;
memset(Matrix, 0, sizeof(Matrix));
cout << "请输入无向简单连通图的关联矩阵:" << endl;
while (1) {
char c;
c = getchar();
if (c == 10 || c == 13) {//回车或换行代表输入完毕,跳出循环
break;
} else if (c != '0' && c != '1') {
cout << "输入错误,请输入 0 或 1 " << endl;
return 0;
} else {
string str;
getline(cin, str);//进行一行读取
Matrix[n][0] = c - '0';
int j = 1;
for (int i = 0; i < int(str.size()); i++) {
//判断输入是否合法
if (str[i] != '0' && str[i] != '1' && str[i] != ' ' && str[i] != 10 && str[i] != 13) {
cout << "输入错误,请输入 0 或 1 " << endl;
return 0;
}
if (str[i] == '0' || str[i] == '1') {
Matrix[n][j] = str[i] - '0';
j++;
}
}
m = j;
j = 1;
n++;
}
}
getMatch();//找最大匹配

return 0;

}

posted @   catting123  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示