Algorithm 图的匹配算法

Algorithm 图的匹配算法,algorithm,graph,graph-algorithm,bipartite,Algorithm,Graph,Graph Algorithm,Bipartite,如果我们有大量与边连接的节点(如与街道交叉),每个节点的值为0到3。边的值为0 现在我想写一个算法,将节点的值分配给值边,因此在算法终止后,所有节点的值都为0,并且所有边都我担心您的算法不会始终有效 例如,如果节点A-B-C的A和B的值为1(C的值为0),那么如果将B中的值指定给A-B交叉点而不是B-C交叉点,则您的算法将失败(因为此时A值无处可去) 我建议阅读最大流量算法,例如 要使用最大流算法解决此问题,您需要定义一个新的有向图。这个新图形为每个交叉口都有一个节点,为每个街道都有一个节点(加

如果我们有大量与边连接的节点(如与街道交叉),每个节点的值为0到3。边的值为0


现在我想写一个算法,将节点的值分配给值边,因此在算法终止后,所有节点的值都为0,并且所有边都我担心您的算法不会始终有效

例如,如果节点A-B-C的A和B的值为1(C的值为0),那么如果将B中的值指定给A-B交叉点而不是B-C交叉点,则您的算法将失败(因为此时A值无处可去)

我建议阅读最大流量算法,例如

要使用最大流算法解决此问题,您需要定义一个新的有向图。这个新图形为每个交叉口都有一个节点,为每个街道都有一个节点(加上一个源节点和汇节点)

您需要边缘:

  • 从源头到每个交叉口,通行能力等于交叉口上的值
  • 从每个十字路口到其连接的街道,通行能力为1
  • 从每条街道到容量为1的接收节点

  • 如果你构建了从源头到汇聚点的最大流量,那么从交叉口到街道的边缘流量告诉你如何分配值。

    恐怕你的算法不会一直有效

    例如,如果节点A-B-C的A和B的值为1(C的值为0),那么如果将B中的值指定给A-B交叉点而不是B-C交叉点,则您的算法将失败(因为此时A值无处可去)

    我建议阅读最大流量算法,例如

    要使用最大流算法解决此问题,您需要定义一个新的有向图。这个新图形为每个交叉口都有一个节点,为每个街道都有一个节点(加上一个源节点和汇节点)

    您需要边缘:

  • 从源头到每个交叉口,通行能力等于交叉口上的值
  • 从每个十字路口到其连接的街道,通行能力为1
  • 从每条街道到容量为1的接收节点

  • 如果您构建了从源头到汇点的最大流量,那么从交叉口到街道的边缘流量将告诉您如何分配值。

    谢谢您关于最大流量的建议。因此,我的边的容量为1,但如何定义源和目标?我想说所有的交叉点(节点)都是源。这是真的吗?尽管我仍然不明白问题的规则是什么(当它限制了将值从节点移动到边缘时?)。对于这种情况,您可以再创建两个虚拟节点作为源和目标,使用虚拟边将它们连接到所有原始节点感谢您关于最大流的建议。因此,我的边的容量为1,但如何定义源和目标?我想说所有的交叉点(节点)都是源。这是真的吗?尽管我仍然不明白问题的规则是什么(当它限制了将值从节点移动到边缘时?)。对于这种情况,您可以再创建两个虚拟节点作为源和目标,将它们连接到具有虚拟边的所有原始节点
    public class Crossing{
        int value;
    }
    
    public class Street{
        int value;
        Crossing A, B;
    }
    
    void allocate(Crossing[] crossings, Street[] streets){
        foreach(crossings as c){ //iterate through every Crossing
            foreach(streets as s){ //Find the streets, which are adjacent to c
                if((s.A == c || s.B == c) && s.value < 1 && c.value != 0) 
                    // The value of the crossing is >0 and the value of the 
                    // street is 0.
                    c.value -= 1;
                    s.value += 1;
            }
        }
    }