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

来源:互联网 发布:淘宝怎么取消手机绑定 编辑:程序博客网 时间:2024/05/22 12:06

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


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 0x3f3f3f3f#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[]:\n");    for(i=0; i<g->num_ver; i++)        printf("%3d ",adjver[i]);    puts("");    printf("lowvost[]:\n");    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("\n");    */}int main(){    int i,j,k,x,y,z;    Mygraph G;    printf("第一次测验\n");    create(&G);    ShortPath(&G,1);    printf("第二次测验\n");    create(&G);    ShortPath(&G,0);    return 0;}/*5 60 1 2 3 40 1 90 2 20 4 61 2 32 3 53 4 19 160 1 2 3 4 5 6 7 80 1 10 2 51 2 31 4 51 3 72 4 12 5 73 4 23 6 34 6 94 5 34 7 95 7 56 7 26 8 77 8 4*/




原创粉丝点击