大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang

以下是空调布线对Dijkstra算法的运用,采用C#实现。

问题:室内机多台,室外机一台。寻找室内机到室外机的最短路径

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Windows;
 
namespace shortestPath
{
    class Program
    {
        const double INF = 429496729;//无路径时的权值
        //--------------------------------------------------------------------------------*
        //函数名: Dijkstra                                                                                *
        //功  能: 找出室内机组和室外机的最短路径(室内机室外机均指投影到最近的墙上的点)*
        //参  数: cost   : List<List<double>>类型                                                     *
        //        n:   int型   所有不重合节点个数,也是cost矩阵的阶                                     *
        //        v:   int型   室内机的标号                                                                *
        //        terminals:   List<int>型  许多室外机的标号                                      *
        //返  回:List<List<int>>类型  每行均为 每个室内机 → 室外机的路径                        *
        //作  者:小鸭酱的书签                                                                          *
        //时  间:2016年3月28日                                                                     *
        //修改时间:                                                                                  *
        //---------------------------------------------------------------------------------*
        static List<List<int>> Dijkstra(List<List<double>> cost, int n, int v, List<int> terminals)
        {
            List<List<int>> allRoutes = new List<List<int>>();//保存所有路径
 
            List<double> dist = new List<double>();
            List<int> s = new List<int>();
            List<int> path = new List<int>();
            double mindis;
            int i, j, u, pre;
            for (i = 0; i < n; i++)
            {
                dist.Add(cost[v][i]);
                s.Add(0);
 
                if (cost[v][i] < INF)
                    path.Add(v);
                else
                    path.Add(-1);
            }
 
            s[v] = 1; //室外机编号v放入s中
            path[v] = 0;
            //循环直到所有顶点的最短路径都求出
            for (i = 0; i < n; i++)
            {
                mindis = INF;
                u = -1;
                for (j = 0; j < n; j++) //选取不在s中且具有最小距离的顶点u
                {
                    if (s[j] == 0 && dist[j] < mindis)
                    {
                        u = j;
                        mindis = dist[j];
                    }
                }
 
                if (u != -1) //找到最小距离的顶点u
                {
                    s[u] = 1; //顶点u加入s中
                    for (j = 0; j < n; j++) //修改不在s中的顶点距离
                    {
                        if (s[j] == 0)
                        {
                            if (cost[u][j] < INF && dist[u] + cost[u][j] < dist[j])
                            {
                                dist[j] = dist[u] + cost[u][j];//修改源点到vj的距离
                                path[j] = u;//保存当前最短路径中的前一个顶点编号
                            }
                        }
                    }
                }
            }
 
            //从室内机到室外机的最短路径
            int index = 0;
            for (i = 0; i < n; i++)
            {
                if (i != v)
                {
                    if (s[i] == 1)
                    {
                        List<int> route = new List<int>();
                        pre = i;
                        while (pre != v) //直到求解到初始顶点
                        {
                            if (index < terminals.Count())
                            {
                                if (terminals[index] == i)
                                {
                                    route.Add(pre);
                                }
                            }
                            pre = path[pre];
                        }
                        if (index < terminals.Count())
                        {
                            if (terminals[index] == i)
                            {
                                route.Add(pre);
                            }
                        }
                        if (index < terminals.Count())
                        {
                            if (terminals[index] == i)
                            {
                                allRoutes.Add(route);
                                index++;
                                if (index == terminals.Count())
                                    return allRoutes;
                            }
                        }
                    }
                }
            }
            return allRoutes;
        }
        static void Main(string[] args)  // test
        {
            List<List<double>> cost = new List<List<double>>();
            List<double> l1 = new List<double>() {INF,5,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF,INF};//1
            List<double> l2 = new List<double>() {5,INF,INF,INF,INF,2,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,4,INF};//1
            List<double> l3 = new List<double>() {INF,INF,INF,5,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,2};//1
            List<double> l4 = new List<double>() {INF,INF,5,INF,INF,INF,INF,INF,INF,5,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l5 = new List<double>() {INF,INF,INF,INF,INF,5,INF,INF,INF,INF,INF,INF,INF,INF,10,INF,INF,INF,INF,INF,INF,1,INF,INF};//1
            List<double> l6 = new List<double>() {INF,2,INF,INF,5,INF,3,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l7 = new List<double>() {INF,INF,INF,INF,INF,3,INF,5,INF,INF,2,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l8 = new List<double>() {INF,INF,INF,INF,INF,INF,5,INF,5,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,3};//1
            List<double> l9 = new List<double>() {INF,INF,INF,INF,INF,INF,INF,3,INF,2,INF,INF,2,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l10 = new List<double>() {INF,INF,INF,5,INF,INF,INF,INF,2,INF,INF,INF,INF,2,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l11 = new List<double>() {INF,INF,INF,INF,INF,INF,2,INF,INF,INF,INF,4,INF,INF,INF,5,INF,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l12 = new List<double>() {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,4,INF,4,INF,INF,INF,5,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l13 = new List<double>() {INF,INF,INF,INF,INF,INF,INF,INF,2,INF,INF,4,INF,2,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l14 = new List<double>() {INF,INF,INF,INF,INF,INF,INF,INF,INF,2,INF,INF,2,INF,INF,INF,INF,5,INF,INF,INF,INF,INF,INF};//1
            List<double> l15 = new List<double>() {INF,INF,INF,INF,10,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,2,INF,INF,INF};//1
            List<double> l16 = new List<double>() {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,5,INF,INF,INF,INF,INF,4,INF,INF,INF,3,INF,INF,INF};//1
            List<double> l17 = new List<double>() {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,5,INF,INF,INF,4,INF,6,INF,2,INF,INF,INF,INF};//1
            List<double> l18 = new List<double>() {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,5,INF,INF,6,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l19 = new List<double>() {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,8,2,INF,INF,INF};//1
            List<double> l20 = new List<double>() {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,2,INF,8,INF,INF,INF,INF,INF};//1
            List<double> l21 = new List<double>() {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,2,3,INF,INF,2,INF,INF,INF,INF,INF};//1
            List<double> l22 = new List<double>() {1,INF,INF,INF,1,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l23 = new List<double>() {INF,4,1,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF};//1
            List<double> l24 = new List<double>() {INF,INF,2,INF,INF,INF,INF,3,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF};//1
            cost.Add(l1);
            cost.Add(l2);
            cost.Add(l3);
            cost.Add(l4);
            cost.Add(l5);
            cost.Add(l6);
            cost.Add(l7);
            cost.Add(l8);
            cost.Add(l9);
            cost.Add(l10);
            cost.Add(l11);
            cost.Add(l12);
            cost.Add(l13);
            cost.Add(l14);
            cost.Add(l15);
            cost.Add(l16);
            cost.Add(l17);
            cost.Add(l18);
            cost.Add(l19);
            cost.Add(l20);
            cost.Add(l21);
            cost.Add(l22);
            cost.Add(l23);
            cost.Add(l24);
 
            List<int> terminals = new List<int>(){22,23};
 
 
            int v = 21;
 
            List<List<int>> result = new List<List<int>>();
 
        result = Dijkstra(cost, 24, v, terminals);
        }
    }
}

Dijkstra算法C#实现及其布线运用的更多相关文章

  1. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  2. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  3. 关于dijkstra算法的一点理解

    最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...

  4. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  5. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  6. Dijkstra算法(一)之 C语言详解

    本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...

  7. 最短路问题Dijkstra算法

    Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...

  8. dijkstra算法求最短路

    艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学. ...

  9. 数据结构之Dijkstra算法

    基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求 ...

随机推荐

  1. Greatest common divisor(gcd)

    欧几里得算法求最大公约数 If A = 0 then GCD(A,B)=B, since the GCD(0,B)=B, and we can stop. If B = 0 then GCD(A,B) ...

  2. 自制单片机之九……写给对制做并口ISP下载线有疑惑的朋友

    一.器件的选用 制做并口ISP下载在网上有很多的电路和对应的PC端下载软件.很多人疑惑,不知该用哪张图,用哪个下载软件.我看了一下,采用的器件主要是74HC373.74HC541和74HC244.其实 ...

  3. WPF中使用文件浏览对话框的几种方式

    原文:WPF中使用文件浏览对话框的几种方式 WPF本身并没有为我们提供文件浏览的控件, 也不能直接使用Forms中的控件,而文件浏览对话框又是我们最常用的控件之一. 下面是我实现的方式 方式1: 使用 ...

  4. CH Round #53 -GCD Path

    描述 给定一张N个点的有向图,点i到点j有一条长度为 i/(gcd(i,j))的边.有Q个询问,每个询问包含两个数x和y,求x到y的最短距离. 输入格式 第一行包含两个用空格隔开的整数,N和Q. 接下 ...

  5. 基于Bootstrap 3.x的免费高级管理控制面板主题:AdminLTE

    AdminLTE 是一个基于Bootstrap 3.x的免费高级管理控制面板主题.AdminLTE - 是一个完全响应式管理模板.基于Bootstrap3框架.高度可定制的,易于使用.适合从小型移动设 ...

  6. Linux下PHP安装配置MongoDB数据库连接扩展

    Web服务器: IP地址:192.168.21.127 PHP安装路径:/usr/local/php 实现目的: 安装PHP的MongoDB数据库扩展,通过PHP程序连接MongoDB数据库 具体操作 ...

  7. js基础例子购物车升级版(未优化版)

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. User Defined Runtime Attributes

    设置View borderWidth/cornerRadius/borderColor 为了兼容CALayer 的KVC ,你得给CALayer增加一个分类 CALayer+BorderColor.h ...

  9. web请求的处理流程

    web请求的处理流程如下: 1.客户发起请求到服务器网卡:2.服务器网卡接受到请求后转交给内核处理:3.内核根据请求对应的套接字,将请求交给工作在用户空间的Web服务器进程4.Web服务器进程根据用户 ...

  10. 设置程序图标-初识IOS

    相信我们都很喜欢做出的程序弄成自己的图标. 在创建项目过后显示的页面中,选择App lcons and launch images,  点击App lcons Source 之后的方向符号,把里面的东 ...