C++实现属性集闭包算法

问题input:关系R(A,B,C,D)以及R的FD(函数依赖)集,如AB->C,D->A,C->Dinout:求出{A,B}的闭包源码:#include <iostream>#include <vector>#include <algorithm>using namespace std;vector<string>...
摘要由CSDN通过智能技术生成
问题

input:关系R(A,B,C,D)以及R的FD(函数依赖)集,如AB->C,D->A,C->D

inout:求出{A,B}的闭包
源码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> DivideFD(vector<string> fd){
   
    vector<string> v1;
    for(size_t i=0;i<fd.size();i++){
   
        //我只能用迭代器的方式截取字符串吗?
        //利用find()实现
        //找到'>'出现的位置ok
        auto position1=fd[i].find(">")+1;
        auto position2=fd[i].find("-");
        string sRight(<
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Warshall传递闭包算法是一种用于寻找有向图中所有节点对之间的可达关系的算法。它的基本思想是使用动态规划,对于每一对节点a和b,判断是否存在节点序列,使得从a到b可以通过这个节点序列到达。如果存在这样的节点序列,那么称节点a和b之间存在一个路径,否则不存在。 Warshall传递闭包算法的核心是使用一个n×n的布尔矩阵T,其中T[i][j]表示从节点i到节点j是否存在一条有向路径。通过不断更新这个矩阵,最终可以得到所有节点对之间的可达关系。 算法实现如下: 1. 初始化矩阵T。对于所有节点i和j,如果存在一条从i到j的有向边,则T[i][j]=true,否则T[i][j]=false。 2. 对于每一个节点k,分别更新所有节点对(i,j),如果存在一条从i到k和一条从k到j的路径,则令T[i][j]=true。 3. 重复步骤2,直到所有节点对之间的可达关系都被确定下来。 下面是代码实现: ``` //实现Warshall传递闭包算法 void Warshall(int graph[][V]) { int i, j, k; //初始化矩阵T int T[V][V]; for (i = 0; i < V; i++) for (j = 0; j < V; j++) T[i][j] = graph[i][j]; //更新矩阵T for (k = 0; k < V; k++) for (i = 0; i < V; i++) for (j = 0; j < V; j++) T[i][j] = T[i][j] || (T[i][k] && T[k][j]); //输出结果 for (i = 0; i < V; i++) { for (j = 0; j < V; j++) cout << T[i][j] << " "; cout << endl; } } ``` 在上述代码中,graph[][]是一个邻接矩阵表示的有向图,V表示节点数。函数Warshall()首先初始化矩阵T,然后进行k轮更新,直到矩阵T中所有节点对之间的可达关系都被确定下来。最后输出矩阵T。 希望我的回答能够帮到你,如果你有任何其他问题,欢迎再向我提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值