zoukankan      html  css  js  c++  java
  • 重新整理数据结构与算法(c#)——算法套路普利姆算法[二十九]

    前言

    看一个题目:

    这个问题就是求最小生成树,是图转换为树的一种方式。

    最小生成树概念:

    最小生成树简称MST。

    1.n个顶点,一定有n-1条边

    2.包含全部顶点。

    3.图转换为最小生成树,权重之和最小。

    解题思路:

    1. 假设从a开始为顶点,找到和a相接的最小边。

    2. 在图中和a相接的是G,那么选择条。然后找到和A、G相接的最小边,是BG,然后选择BG这条边。

    3. 以此类推。

    正文

    代码:

    static void Main(string[] args)
    {
    	char[] data = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
    	int verxs = data.Length;
    	//邻接矩阵的关系使用二维数组表示,10000这个大数,表示两个点不联通
    	int[,] weight = new int[,]{
    	{10000,5,7,10000,10000,10000,2},
    	{5,10000,10000,9,10000,10000,3},
    	{7,10000,10000,10000,8,10000,10000},
    	{10000,9,10000,10000,10000,4,10000},
    	{10000,10000,8,10000,10000,5,4},
    	{10000,10000,10000,4,5,10000,6},
    	{2,3,10000,10000,4,6,10000},};
    	//创建要修的路,初始化节点的个数
    	MGraph mGraph = new MGraph(verxs);
    	//创建一个MinTree对象
    	MinTree minTree = new MinTree();
    	minTree.createGraph(mGraph, verxs, data, weight);
    	Console.WriteLine("显示原始图");
    	minTree.showGraph(mGraph);
    	var newGraph=minTree.prim(mGraph, 0);
    	Console.WriteLine("显示最小生成树图");
    	minTree.showGraph(newGraph);
    	Console.Read();
    } 
    }
    
    class MinTree {
    //不污染数据
    public void createGraph(MGraph mGraph, int verxs, char[] data, int[,] weight)
    {
    	for (int i = 0; i < verxs; i++)
    	{
    		mGraph.data[i] = data[i];
    		for (int j = 0; j < verxs; j++)
    		{
    			mGraph.weight[i,j] = weight[i,j];
    		}
    	}
    }
    //遍历图
    public void showGraph(MGraph mGraph)
    {
    	for (int i=0;i<mGraph.verxs;i++)
    	{
    		for (int j = 0; j < mGraph.verxs; j++)
    		{
    			Console.Write(mGraph.weight[i,j]+"  ");
    		}
    		Console.WriteLine();
    	}
    }
    
    /// <summary>
    /// 图转树核心算法
    /// </summary>
    /// <param name="mGraph">原始图</param>
    /// <param name="v">初始化访问节点</param>
    public MGraph prim(MGraph mGraph,int v)
    {
    	int[] isVisited = new int[mGraph.verxs];
    	isVisited[v] = 1;
    	int y = -1;//y为数组竖轴
    	int x = -1;//x为数组横轴
    	MGraph newGraph = new MGraph(mGraph.verxs);
    	newGraph.data = (char[])mGraph.data.Clone();
    	int minWeight = 1000;
    	//一共要计算出verxs-1条边
    	for (int k=1;k<mGraph.verxs;k++)
    	{
    		for (int i=0;i<mGraph.verxs;i++)
    		{
    			for (int j = 0; j < mGraph.verxs ; j++)
    			{
    				if (isVisited[i] == 1 && isVisited[j] == 0 && mGraph.weight[i, j] < minWeight)
    				{
    					y = i;
    					x = j;
    					minWeight = mGraph.weight[i, j];
    				}
    			}
    		}
    		Console.WriteLine("在"+mGraph.data[y]+"和"+ mGraph.data[x]+"之间修了一条权重为"+minWeight+"的路");
    		newGraph.weight[y,x] = minWeight;
    		isVisited[x] = 1;
    		minWeight = 1000;
    	}
    	return newGraph;
    }
    }
    

    结果:

  • 相关阅读:
    【redis源码】(三)Zipmap
    【redis源码】(五)Ziplist
    mint 13 安装 phpunit
    【php】nginx phpfpm “session锁”问题
    linux 系统下 恢复被误删文件
    【python】python相关的那些事【一】python 中的变量
    【redis源码】(八) Intset.c
    【python】【scrapy】使用方法概要(三)
    【redis源码】(六)Ae.c
    【c++】关于默认构造函数
  • 原文地址:https://www.cnblogs.com/aoximin/p/13338914.html
Copyright © 2011-2022 走看看