C 在二部图中查找映射

C 在二部图中查找映射,c,graph,matrix,bipartite,C,Graph,Matrix,Bipartite,在二部图中有一个表示连接的平方二元矩阵。问题是:是否存在所有行到列的一对一映射?(需要明确的是,如果我使用了错误的语言,则完全连通图满足这一要求,因为我们不仅限于一对一映射) 我写了以下内容。有没有比这快得多的方法 /* Is there a one-to-one mapping possible with the given bipartite graph? input: graph[a][b] = connected (1) or not (0) return: 0=no 1=

在二部图中有一个表示连接的平方二元矩阵。问题是:是否存在所有行到列的一对一映射?(需要明确的是,如果我使用了错误的语言,则完全连通图满足这一要求,因为我们不仅限于一对一映射)

我写了以下内容。有没有比这快得多的方法

/* Is there a one-to-one mapping possible with the given bipartite graph?
   input:  graph[a][b] = connected (1) or not (0)
   return: 0=no 1=yes */
int one_to_one(int graph[SIZE][SIZE], int rows_checked /* =0 */, int col_chosen /* =0 */)
{
    int my_graph[SIZE][SIZE], i, j, retval;
    memcpy(my_graph, graph, sizeof(graph[0][0]) * SIZE * SIZE);

    if (rows_checked > 0) 
        for (i=rows_checked; i<SIZE; i++)
            my_graph[i][col_chosen] = -1; /* flag for "this column done" */

    retval=1;
    for (i=0; i<SIZE; i++) {
        if (my_graph[rows_checked][i] == -1)
                    continue;
        retval=0;
        if (my_graph[rows_checked][i] == 1)
            if (one_to_one(my_graph, rows_checked+1, i))
                return 1;
    }
    return retval;
}
/*给定的二部图是否存在一对一映射?
输入:图形[a][b]=已连接(1)或未连接(0)
返回:0=否1=是*/
int-one(int-graph[SIZE][SIZE],选中int-rows/*=0*/,选中int-col/*=0*/)
{
int my_图[SIZE][SIZE],i,j,retval;
memcpy(my_graph,graph,sizeof(graph[0][0])*SIZE*SIZE);
如果(选中的行数>0)

对于(i=rows_checked;i我假设在您的表示中,您的意思是有一个二分图,其中两个“边”具有相同数量的节点,而该图[a][B]意味着如果每个分区中的所有节点都以垂直线布置,则从“左”节点a到“右”节点B存在连接

如果图是稀疏的,那么您的算法实际上并没有那么糟糕,并且它具有简单的优点

对于密度更大的图,它是指数型的,如果您愿意为它编写代码,您可以做得更好。如果您向图中添加一个连接到所有“左”节点的源节点,以及一个连接到所有“右”节点的接收器节点,并将容量1分配给包括新节点在内的所有边缘,则当且仅当存在一对一配对时,从源到接收器的最大网络流量等于大小。如果使用诸如的算法来计算流量,则每个循环将连接额外的一对节点,并根据需要重新排列现有连接以实现此目的n、 直到它不再可能。运行时大小将在^3以内

这也可以直接通过二部图表示和重新排列匹配对来实现,但我发现,如果将其构建为一个网络流实现,然后从那里开始重构,则最容易理解。有关查找最大匹配数时稍微更一般的问题的信息,请参阅二部图中的d对,这就是基于流的解决方案实际解决的问题


如果你真的想要速度,看看我还没有实现的,我刚刚读到的关于我自己的文章。链接的页面说明它有一个最坏的情况(在这个例子中)大小为^(5/2)并且在优化稀疏图方面与Ford Fulkerson一样优秀或更好。

谢谢你,这将使它变得清晰,并为我提供一些选择。我将继续研究,看看什么可以提供最佳性能。