【QuikGraph】图算法之Prim最小生成树求解

介绍

最小生成树概念与算法介绍

QuikGraph的PrimMinimumSpanningTreeAlgorithm的API地址

示例

测试代码:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using QuikGraph;
using QuikGraph.Algorithms.MinimumSpanningTree;
using QuikGraph.Algorithms.Observers;
using System;
using System.Collections.Generic;

namespace QuikGraphTest
{
    [TestClass]
    public class TestPrim
    {
        UndirectedGraph<string, EquatableEdge<string>> _graph
             = new UndirectedGraph<string, EquatableEdge<string>>();
        private readonly Dictionary<EquatableEdge<string>, double> _weightsDict
            = new Dictionary<EquatableEdge<string>, double>();
        private void AddVertex(string v)
        {
            _graph.AddVertex(v);
        }
        private void AddEdge(string from, string to, double weight = 1)
        {
            var e1 = new EquatableEdge<string>(from, to);
            var e2 = new EquatableEdge<string>(to, from);
            _graph.AddEdge(e1);
            _graph.AddEdge(e2);
            _weightsDict.Add(e1, weight);
            _weightsDict.Add(e2, weight);

        }
        public Func<EquatableEdge<string>, double> GetWeightsFunc()
        {
            return edge => _weightsDict[edge];
        }
        [TestMethod]
        public void TestMethod1()
        {
            AddVertex("n1");
            AddVertex("n2");
            AddVertex("n3");
            AddVertex("n4");
            AddVertex("n5");
            AddVertex("n6");

            AddEdge("n1", "n2", 10);
            AddEdge("n2", "n3", 8);
            AddEdge("n3", "n4", 11);
            AddEdge("n4", "n5", 6);
            AddEdge("n5", "n6", 9);
            AddEdge("n1", "n6", 3);
            AddEdge("n2", "n6", 5);
            AddEdge("n3", "n6", 18);
            AddEdge("n3", "n5", 21);

            var prim = new PrimMinimumSpanningTreeAlgorithm<string, EquatableEdge<string>>
                (_graph, GetWeightsFunc());

            var edgeRecorder = new EdgeRecorderObserver<string, EquatableEdge<string>>();
            using (edgeRecorder.Attach(prim))
                prim.Compute();

            foreach (var edge in edgeRecorder.Edges)
            {
                Console.WriteLine(edge);
            }
        }
    }
}

控制台输出:

n1 -> n6
n2 -> n6
n2 -> n3
n5 -> n6
n4 -> n5

效果图:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值