dijstla算法

来源:互联网 发布:秒杀网 淘宝mseav 编辑:程序博客网 时间:2024/05/21 11:29
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<conio.h>#define Max 30typedef char str[30];typedef struct{char dian[Max];int bian[Max][Max];int d,b;}ljt;void creat(ljt &G);//有向网有注释void disp(ljt G);void dijstla(ljt G);void creat(ljt &G){//有向网int i,j,k,w;printf("请输入顶点数和边数:\n");scanf("%d %d",&G.d,&G.b);fflush(stdin);for(i=0;i<G.d;i++){printf("请输入第%d个顶点的信息:",i+1);scanf("%c",&G.dian[i]);fflush(stdin);}for(i=0;i<G.d;i++)for(j=0;j<G.d;j++) {if(i==j) G.bian[i][j]=0;else G.bian[i][j]=100;}for(k=0;k<G.b;k++){printf("请输入第%d边依附的两个顶点的序号和权值:",k+1);scanf("%d %d %d",&i,&j,&w);fflush(stdin);G.bian[i-1][j-1]=w;}}void disp(ljt G){// 显示int i,j,k;for(i=0;i<G.d;i++)printf("%5c  ",G.dian[i]);printf("\n");for(j=0;j<G.d;j++){for(k=0;k<G.d;k++){printf("%d    ",G.bian[j][k]); }printf("\n");}}void dijstla(ljt G){str path[30];int dist[30];str s,a;int v,i,k,num;printf("请输入起始点:");scanf("%d",&v);for(i=0;i<G.d;i++){dist[i]=G.bian[v][i];if(dist[i]!=100&&dist[i]!=0){path[i][0]=G.dian[v];path[i][1]=G.dian[i];path[i][2]='\0';}elsepath[i][0]='\0';}s[0]=G.dian[v];num=1;dist[v]=0;while(num<G.d){k=0;while(dist[k]==0)k++;for(i=0;i<G.d;i++)if(dist[i]<dist[k]&&dist[i]!=0)k=i;printf("%d%3s  ",dist[k],path[k]);s[num++]=G.dian[k];for(i=0;i<G.d;i++)if(dist[i]>dist[k]+G.bian[k][i]){dist[i]=dist[k]+G.bian[k][i];a[0]=G.dian[i];a[1]='\0';strcat(path[k],a);strcpy(path[i],path[k]);}dist[k]=0;}}void main(){ljt G;creat(G);    disp(G);    dijstla(G);}
0 0
原创粉丝点击