• 图论 迪杰斯特拉dijkstra求最短路径


    这个测试用的是下面这个图:


    9 16
    0 1 2 3 4 5 6 7 8
    0 1 1
    0 2 5
    1 2 3
    1 4 5
    1 3 7
    2 4 1
    2 5 7
    3 4 2
    3 6 3
    4 6 9
    4 5 3
    4 7 9
    5 7 5
    6 7 2
    6 8 7
    7 8 4


    运行结果如下:



    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<cmath>
    #define inf 65535
    #include<algorithm>
    typedef struct Graph
    {
        int vertex[100];
        int arc[100][100];
        int num_ver,num_edge;
    } Mygraph;
    void create(Mygraph *g)//建图
    {
        int i,j,tmp,a,b,c;
        scanf("%d%d",&g->num_ver,&g->num_edge);//输入结点数和边数
        for(i=0; i<g->num_ver; i++)//输入结点集
            scanf("%d",&g->vertex[i]);
    
        for(i=0; i<g->num_ver; i++)//边的权值初始化
        {
            for(j=0; j<g->num_ver; j++)
                g->arc[i][j]=inf;
        }
        for(i=0; i<g->num_edge; i++)//输入边的权值
        {
            scanf("%d%d%d",&a,&b,&c);
            g->arc[a][b]=c;
            g->arc[b][a]=c;
        }
    }
    void ShortPath(Mygraph *g,int x)
    {
        int i,j,k,tmp,Min;
        int adjver[100];
        int final[100];
        int sum=0;
        memset(final,0,sizeof(final));
        int lowcost[100];
        final[x]=1;
    
        //其实这个算法跟prime算法实现很相似,制作了一些很小的改动
        //就新增了一个final数组,用来记录这个点是够走过,如果走过就不再走,因为如果记录final[k]=1,那么
        //就是认为到达k点最短路径就是当前的样子,不能是其他的
    
        for(i=0; i<g->num_ver; i++)
        {
            lowcost[i]=g->arc[x][i];
            adjver[i]=x;
        }
        lowcost[x]=0;
        for(i=0; i<g->num_ver; i++)
        {
            Min=inf;//Min用来找最小的边权值
            j=0;
            while(j<g->num_ver)
            {
                if(!final[j]&&lowcost[j]<Min)
                {
                    Min=lowcost[j];
                    k=j;
                }
                j++;
            }
            //现在k里存的是从当前以选择结点出发可以到达的最近的结点(即边权值最小)
            final[k]=1;
            for(j=0; j<g->num_ver; j++)
            {
    
                if(!final[j]&&Min+g->arc[k][j]<lowcost[j])
                {
                    lowcost[j]=Min+g->arc[k][j];
                    adjver[j]=k;
                }
            }
        }
        printf("adjver[]:
    ");
        for(i=0; i<g->num_ver; i++)
            printf("%3d ",adjver[i]);
        puts("");
        printf("lowvost[]:
    ");
        for(i=0; i<g->num_ver; i++)
            printf("%3d ",lowcost[i]);
        puts("");
    
        /*打印0到8的路径*/
        /*
        int ans[10];
        int temp=8,cout_ans=0;
        ans[cout_ans++]=8;
        while(adjver[temp]!=0){
            ans[cout_ans++]=adjver[temp];
            temp=adjver[temp];
        }
        ans[cout_ans++]=0;
        for(i=cout_ans-1;i>=0;i--)
            printf("%d ",ans[i]);
        printf("
    ");
        */
    
    }
    
    
    int main()
    {
        int i,j,k,x,y,z;
        Mygraph G;
        printf("第一次测验
    ");
        create(&G);
        ShortPath(&G,1);
        printf("第二次测验
    ");
        create(&G);
        ShortPath(&G,0);
    
        return 0;
    }
    /*
    5 6
    0 1 2 3 4
    0 1 9
    0 2 2
    0 4 6
    1 2 3
    2 3 5
    3 4 1
    
    9 16
    0 1 2 3 4 5 6 7 8
    0 1 1
    0 2 5
    1 2 3
    1 4 5
    1 3 7
    2 4 1
    2 5 7
    3 4 2
    3 6 3
    4 6 9
    4 5 3
    4 7 9
    5 7 5
    6 7 2
    6 8 7
    7 8 4
    */
    




  • 相关阅读:
    【转】数据库分页Java实现
    【转】ibatis的简介与初步搭建应用
    response.setContentType()的作用及参数
    【转】mysql数据库中实现内连接、左连接、右连接
    【转】JAVA的StringBuffer类
    【转】Java学习之Iterator(迭代器)的一般用法 (转)
    函数装饰器
    闭包函数
    函数(2)
    函数(1)
  • 原文地址:https://www.cnblogs.com/hjch0708/p/7554831.html
Copyright © 2020-2023  润新知