zoukankan      html  css  js  c++  java
  • 图论 迪杰斯特拉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
    */
    




  • 相关阅读:
    0309. Best Time to Buy and Sell Stock with Cooldown (M)
    0621. Task Scheduler (M)
    0106. Construct Binary Tree from Inorder and Postorder Traversal (M)
    0258. Add Digits (E)
    0154. Find Minimum in Rotated Sorted Array II (H)
    0797. All Paths From Source to Target (M)
    0260. Single Number III (M)
    0072. Edit Distance (H)
    0103. Binary Tree Zigzag Level Order Traversal (M)
    0312. Burst Balloons (H)
  • 原文地址:https://www.cnblogs.com/hjch0708/p/7554831.html
Copyright © 2011-2022 走看看