zoukankan      html  css  js  c++  java
  • 【Class 学习笔记】 单源点最短

    一、前言

            这是作业 ,没怎么深入,BUT记录.

            算法这种东西,如果只是重复前人的成果,实在没什么意思。我觉得至少我们学校的算法教学是有问题的,大家都还不会分析,就直接读代码,什么空间复杂度的分析,时间复杂度的分析都还搞不懂,连怎么分析都不知道怎么可能能够设计出算法......MIT的算法导论不错。

    二、资源

            1、单源点的基本思想,认真看一遍就可以懂的:

             http://www.cnblogs.com/xiaosuo/archive/2010/03/23/1656921.html#2232020

            2、有向图的储存

                  邻接矩阵或者是链表

    三、My代码

           纯记录 

            邻接矩阵

    #include <stdio.h>
    #include <stdlib.h>
    #define VER_NUMBER 7
    #define MAXUM 1000

    /*获取下一个目标节点*/
    int getMin(int dist[],int s[])
    {
    int i;
    int tmp_minver=0;
    for(i=0;i<VER_NUMBER;i++)
    {
    if(1==s[tmp_minver]) tmp_minver++;
    else if(0!=dist[i]&&1!=s[i]&&dist[i]<dist[tmp_minver]) tmp_minver=i;
    }
    return tmp_minver;
    }


    /*获取最短路径*/
    void getShortest(int v,int cost[][VER_NUMBER],int dist[],int road[])
    {
    int i,j,n;
    int tmp_len=0;
    int tmp_ver=0;
    int s[VER_NUMBER];
    for(i=0;i<VER_NUMBER;i++)
    {
    s[i]=0;
    dist[i]=cost[v-1][i];
    road[i]=v-1;
    }
    s[v-1]=1;
    dist[v-1]=0;
    for(j=1;j<VER_NUMBER;j++)
    {
    /*确定当前选定节点*/
    tmp_ver=getMin(dist,s);
    s[tmp_ver]=1;
    for(n=0;n<VER_NUMBER;n++)
    {
    if(0==s[n]){
    /*更改最短路径,保存最短路径的上一个节点*/
    tmp_len=dist[tmp_ver]+cost[tmp_ver][n];
    if(dist[n]>tmp_len){
    dist[n]=tmp_len;
    road[n]=tmp_ver;
    }
    }
    tmp_len=0;
    }
    }
    }

    int main(){

    int i,j;
    int dist[VER_NUMBER]={0,0,0,0,0,0,0};
    int map[VER_NUMBER][VER_NUMBER]={
    {MAXUM,20,50,30,MAXUM,MAXUM,MAXUM},
    {MAXUM,0,25,MAXUM,MAXUM,70,MAXUM},
    {MAXUM,MAXUM,0,40,25,50,MAXUM},
    {MAXUM,MAXUM,MAXUM,0,55,MAXUM,MAXUM},
    {MAXUM,MAXUM,MAXUM,MAXUM,0,10,70},
    {MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,0,50},
    {MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,0}
    };
    int road[VER_NUMBER]={0,0,0,0,0,0,0};
    int start=1;
    getShortest(start,map,dist,road);
    for(i=0;i<VER_NUMBER;i++)
    {
    printf("Ver 1 To Ver %d: %d\n",i+1,dist[i]);
    printf("ROAD:\n");
    printf("%d",i+1);
    for(j=i;j<VER_NUMBER&&0!=road[j];)
    {
    printf("<-%d",road[j]+1);
    j=road[j];
    }
    printf("<-%d\n",start);
    }
    return 1;

    }


     1 #include <stdio.h>
    2 #include <stdlib.h>
    3 #define VER_NUMBER 7
    4 #define MAXUM 1000
    5
    6
    7 int getMin(int dist[],int s[])
    8 {
    9 int i;
    10 int tmp_minver=0;
    11 for(i=0;i<VER_NUMBER;i++)
    12 {
    13 if(1==s[tmp_minver]) tmp_minver++;
    14 else if(0!=dist[i]&&1!=s[i]&&dist[i]<dist[tmp_minver]) tmp_minver=i;
    15 }
    16 return tmp_minver;
    17 }
    18
    19
    20
    21 void getShortest(int v,int cost[][VER_NUMBER],int dist[],int road[])
    22 {
    23 int i,j,n;
    24 int tmp_len=0;
    25 int tmp_ver=0;
    26 int s[VER_NUMBER];
    27 for(i=0;i<VER_NUMBER;i++)
    28 {
    29 s[i]=0;
    30 dist[i]=cost[v-1][i];
    31 road[i]=v-1;
    32 }
    33 s[v-1]=1;
    34 dist[v-1]=0;
    35 for(j=1;j<VER_NUMBER;j++)
    36 {
    37 tmp_ver=getMin(dist,s);
    38 s[tmp_ver]=1;
    39 for(n=0;n<VER_NUMBER;n++)
    40 {
    41 if(0==s[n]){
    42 tmp_len=dist[tmp_ver]+cost[tmp_ver][n];
    43 if(dist[n]>tmp_len){
    44 dist[n]=tmp_len;
    45 road[n]=tmp_ver;
    46 }
    47 }
    48 tmp_len=0;
    49 }
    50 }
    51 }
    52
    53 int main(){
    54
    55 int i,j;
    56 int dist[VER_NUMBER]={0,0,0,0,0,0,0};
    57 int map[VER_NUMBER][VER_NUMBER]={
    58 {MAXUM,20,50,30,MAXUM,MAXUM,MAXUM},
    59 {MAXUM,0,25,MAXUM,MAXUM,70,MAXUM},
    60 {MAXUM,MAXUM,0,40,25,50,MAXUM},
    61 {MAXUM,MAXUM,MAXUM,0,55,MAXUM,MAXUM},
    62 {MAXUM,MAXUM,MAXUM,MAXUM,0,10,70},
    63 {MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,0,50},
    64 {MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,MAXUM,0}
    65 };
    66 int road[VER_NUMBER]={0,0,0,0,0,0,0};
    67 int start=1;
    68 getShortest(start,map,dist,road);
    69 for(i=0;i<VER_NUMBER;i++)
    70 {
    71 printf("Ver 1 To Ver %d: %d\n",i+1,dist[i]);
    72 printf("ROAD:\n");
    73 printf("%d",i+1);
    74 for(j=i;j<VER_NUMBER&&0!=road[j];)
    75 {
    76 printf("<-%d",road[j]+1);
    77 j=road[j];
    78 }
    79 printf("<-%d\n",start);
    80 }
    81 return 1;
    82
    83 }
    84
    85
    86
  • 相关阅读:
    身份证号验证
    QML学习笔记(七)— 实现可拖拽、编辑、选中的ListView
    通过WebChannel/WebSockets与QML中的HTML交互
    OpenLayers学习笔记(七)— 类似比例尺的距离环(一)
    OpenLayers学习笔记(六)— 拖拽叠加层overlayer
    OpenLayers学习笔记(五)— 拖拽Feature图层
    QML学习笔记(六)- 简单计时器和定时器
    QML学习笔记(五)— 做一个简单的待做事项列表
    OpenLayers学习笔记(四)— QML显示html中openlayers地图的坐标
    OpenLayers学习笔记(三)— QML与HTML通信之 地图上点击添加自由文本
  • 原文地址:https://www.cnblogs.com/hundan/p/2237898.html
Copyright © 2011-2022 走看看