离散题目12(判断是否为函数 c++处理)

离散题目12 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description给出两个集合,以及两个集合上的关系。判断该关系能不能构成函数 Input多组输入。第一行数字表示集合A;第二行数字表示集合B;第三行一个数字N,表示关系的个数。以下N行,每行两个数字a b,用来描述关系a→b。0 < n <
摘要由CSDN通过智能技术生成

离散题目12
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description

给出两个集合,以及两个集合上的关系。判断该关系能不能构成函数
Input

多组输入。第一行数字表示集合A;第二行数字表示集合B;第三行一个数字N,表示关系的个数。以下N行,每行两个数字a b,用来描述关系a→b。0 < n < = 20000,集合A、B的大小不超过10000.
Output

每组数据输出一行,所给关系属于函数,输出’yes’ ,否则输出‘no’。
Example Input

1 2 3
4 5 6
3
1 4
2 5
3 6
1 2 3
4 5 6
3
1 4
1 5
1 6
Example Output

yes
no

#include <iostream>
#include<cstdio>
#include<sstream>
#include<string.h>
#include<stdlib.h>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
离散数学中,图的同构问题是一个经典难题,目前还没有找到一个高效的通用算法来解决。不过在特定情况下(例如小规模的图),可以使用暴力枚举来判断两个图是否同构。 以下是一个基于邻接矩阵表示的简单的同构判断程序的 C++ 代码示例: ```c++ #include <iostream> #include <vector> #include <cstring> using namespace std; const int MAXN = 10; // 最大顶点数 int n; // 顶点数 int a[MAXN][MAXN]; // 邻接矩阵 // 判断两个图是否同构 bool isomorphism(int p[], int q[], int k) { if (k == n) { // 如果已经枚举完所有的顶点,判断两个图是否同构 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (a[p[i]][p[j]] != a[q[i]][q[j]]) { return false; } } } return true; } else { // 枚举顶点的排列方式 for (int i = 0; i < k; i++) { bool flag = true; for (int j = 0; j < k; j++) { if (p[j] == i || q[j] == k - 1) { flag = false; break; } } if (flag) { p[k] = i; q[k] = k - 1; if (isomorphism(p, q, k + 1)) { return true; } } } return false; } } int main() { // 读入图的信息 cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> a[i][j]; } } // 枚举顶点的排列 int p[MAXN], q[MAXN]; memset(p, 0, sizeof(p)); memset(q, 0, sizeof(q)); if (isomorphism(p, q, 1)) { cout << "两个图同构" << endl; } else { cout << "两个图不同构" << endl; } return 0; } ``` 该程序通过枚举两个图的顶点排列方式来判断它们是否同构,时间复杂度为 $O(n!)$,只适用于小规模的图。在实际应用中,通常需要使用更高效的算法来解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值