dijkatra算法的实现

来源:互联网 发布:sqlserver免费版 编辑:程序博客网 时间:2024/06/10 09:59
/*完成度1基本要求2随意命名3有向图*/#include<stdio.h>#include<string.h>#include<stdbool.h>#define VEX_MAX 50char vex[VEX_MAX][20];int  arcweight[VEX_MAX][VEX_MAX],vexnum;int  way[VEX_MAX][VEX_MAX];void creategraph(){    int i,j;    printf("输入顶点:\n");    for(i=0;i<VEX_MAX;i++){        scanf("%s",vex[i]);        if(vex[i][0]=='0')break;//0作为结束标记        }    vex[i][0]='\0';    vexnum=i;//记录顶数目    //for(i=0;vex[i][0]!='\0';i++){    //    printf("%s\n1\n",vex[i]);    //    }    for(i=0;i<vexnum;i++)        for(j=0;j<vexnum;j++){            if(i==j)arcweight[i][j]=0;            else                arcweight[i][j]=99999999;//初始化所有边不联通        }    printf("选择图的类型 1.无向图 2.有向图:");    int type;    scanf("%d",&type);    if(type==1){        printf("输入边以及相应权值,格式为:端点,端点,权值\n");        char temp1[20],temp2[20],temp3[]={'0','\0'};        int a,b,weight;        while(1){            scanf("%s",temp1);            if(strcmp(temp1,temp3)==0)break;            scanf("%s%d",temp2,&weight);            for(i=0;i<vexnum;i++){                if(strcmp(temp1,vex[i])==0)a=i;                if(strcmp(temp2,vex[i])==0)b=i;            }            arcweight[a][b]=weight;            arcweight[b][a]=weight;        }    }    else if(type==2){        printf("输入边以及相应权值,格式为:尾,头,权值\n");        char temp1[20],temp2[20],temp3[]={'0','\0'};        int a,b,weight;        while(1){            scanf("%s",temp1);            if(strcmp(temp1,temp3)==0)break;            scanf("%s%d",temp2,&weight);            for(i=0;i<vexnum;i++){                if(strcmp(temp1,vex[i])==0)a=i;                if(strcmp(temp2,vex[i])==0)b=i;            }            arcweight[a][b]=weight;        }    }    else printf("错误,必须选择二者之一");}void findsway(char*u,char*v){    int a,b,i,j;    bool flag[vexnum],path[vexnum][vexnum];    for(i=0;i<vexnum;i++){        if(strcmp(u,vex[i])==0)a=i;        if(strcmp(v,vex[i])==0)b=i;        }    int distance[vexnum];    for(i=0;i<vexnum;i++){        flag[i]==false;        distance[i]=arcweight[a][i];        for(j=0;j<vexnum;j++)path[i][j]=false;//空路径        if(distance[i]<99999999){path[i][a]=true;path[i][i]=true;}    }        distance[a]=0;flag[a]=true;        for(i=0;i<vexnum-1;i++){//执行vexnum-1次,然后得到生成树            int min=99999999,c;            for(j=0;j<vexnum;j++)                if(!flag[j])                    if(distance[j]<min){c=j;min=distance[j];}            flag[c]=true;//循环结束后c为离a最近的顶            for(j=0;j<vexnum;j++)                if(!flag[j]&&(min+arcweight[c][j])<distance[j]){                    distance[j]=min+arcweight[c][j];                    int k;                    for(k=0;k<vexnum;k++)path[j][k]=path[c][k];                    path[j][j]=true;                }//if        }//for        //输出路径以及权值        printf("%s到%s之间的路径最短长度为%d,具体见下方表示,数字为%s到各个点的距离\n",u,v,distance[b],u);        int num=0,max=0,mark,k=0;        for(i=0;i<vexnum;i++)//为了顺序输出的操作            if(path[b][i])num++;//计算顶点数        int way[num];        for(i=0;i<vexnum;i++)            if(path[b][i]){way[k]=i;k++;}        for(i=0;i<num;i++){            max=0;            for(j=0;j<num-i;j++)                if(distance[way[j]]>=max){max=distance[way[j]];mark=j;}            int swaptemp;            swaptemp=way[num-1-i];            way[num-1-i]=way[mark];            way[mark]=swaptemp;        }        for(i=0;i<num-1;i++)            printf("%s%d-->",vex[way[i]],distance[way[i]]);        printf("%s%d",vex[way[i]],distance[way[i]]);}//findswayint main(){    char u[20],v[20];    creategraph();    printf("输入你的路线起点与终点,请确保二者之间至少有一条路径\n");    scanf("%s%s",u,v);    findsway(u,v);    return 0;}

原创粉丝点击