図2点間の最短経路、すべての経路アルゴリズムC言語実現


#include
#include
#include
#define INFINITY      32768       //   
#define MAX_VERTEX_NUM      11    //     
typedef struct ArCell
{
   int adj;    //    ,     0-1-      ,         
}ArCell;
typedef struct   //          ,       、  、     ,
{
char name[30];  //  
int num;         //  
char introduction[100];//  
}VertexDat;  //        
typedef struct
{
 VertexDat vexs[MAX_VERTEX_NUM];  //    
 ArCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//    
int vexnum,arcnum;  //   ,  
}MGraph;//    
MGraph *G; //    ,    



/*         

       ,  for        ,  ,  ,           
             

*/
MGraph *CreatUDN(MGraph *G)//     ,      
{
 int i,j,k,w;//i,j,k,w      
 char s[10] = "A";
#if 0 
 printf("        ,  :");
 scanf("%d%d",&G->vexnum,&G->arcnum); //       
 printf("        :、  、  :
"); // , , for(i=1;i<=G->vexnum;i++) { printf(" :"); scanf("%d",&G->vexs[i].num); printf(" :"); scanf("%s",G->vexs[i].name); printf(" :"); scanf("%s",G->vexs[i].introduction); } for(i=1;i<=G->vexnum;i++) for(j=1;j<=G->vexnum;j++) G->arcs[i][j].adj=INFINITY; printf(" :
"); // ( ) for(k=1;k<=G->arcnum;k++) { printf(" %d :
",k); printf(" (i,j):"); // scanf("%d",&i); scanf("%d",&j); printf(" :"); // scanf("%d",&w); G->arcs[i][j].adj=w; // G G->arcs[j][i]=G->arcs[i][j];// , , // 。 } #else G->vexnum = 6; G->arcnum = 14; for(i=1;i<=G->vexnum;i++) { G->vexs[i].num = i; strcpy(G->vexs[i].name, s); strcpy(G->vexs[i].introduction, s); *s += 1; } for(i=1;i<=G->vexnum;i++) for(j=1;j<=G->vexnum;j++) G->arcs[i][j].adj=INFINITY; i = 1;j=2; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j];// , , // 。 i = 2;j=1; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 1;j=3; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 3;j=1; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 2;j=3; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 3;j=2; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 3;j=4; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 4;j=3; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 3;j=5; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 5;j=3; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 4;j=6; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 6;j=4; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 5;j=6; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; i = 6;j=5; G->arcs[i][j].adj=1; // G G->arcs[j][i]=G->arcs[i][j]; #endif printf("\t !
"); return G; } /* ( ) 1. v0 : Dist[i]=G->arcs[v0][vi].adj;{vi V-S} 2. vk, Dist[i]=min(Dist[i]|vi V-S) vk v0 3. vk S 4. v0 V-S vi : v0 V-S vi Dist[i] v0 , S vk, V-S vi : Dist[k]+G->arcs[v][w].adj Dist[k]+G->arcs[v][w].adjarcs[k][i].adj; n-1 v0 O(n*n). */ long int Dist[MAX_VERTEX_NUM]; // int p[MAX_VERTEX_NUM ][MAX_VERTEX_NUM]; // void ShortestPath_DIJ(MGraph *G,int v0)// ,v0 { int v,w,i,min,x; //v,w,i,x ,min int path[MAX_VERTEX_NUM]; // for(v=1;v<=G->vexnum;v++) { path[v]=0; // v0 v Dist[v]=G->arcs[v0][v].adj; // D for(w=1;w<=G->vexnum;w++) p[v][w]=0; // if(Dist[v]vexnum;i++) // , v0 , S { min=INFINITY; // v0 for(w=1;w<=G->vexnum;w++) if(!path[w]) //w v-s if(Dist[w]vexnum;w++) if(!path[w]&&(min+G->arcs[v][w].adjarcs[v][w].adj; // s , for(x=1;x<=G->vexnum;x++) p[w][x]=p[v][x]; p[w][w]=1; } } }//ShortestPath_DIJ end void output(int sight1,int sight2) // { int a,b,c,d,q=0; a=sight2; /* a */ if(a!=sight1) /* , ... */ { printf("
\t %s %s ",G->vexs[sight1].name,G->vexs[sight2].name);/* */ printf("\t( %dm.)

\t",Dist[a]); /* sight1 sight2 , D[] */ printf("\t%s",G->vexs[sight1].name); /* */ d=sight1; /* d */ for(c=1;c<=MAX_VERTEX_NUM;c++) { gate:; /* , goto */ p[a][sight1]=0; for(b=1;b<=MAX_VERTEX_NUM;b++) { if(G->arcs[d][b].adj%s",G->vexs[b].name); /* */ p[a][b]=0; d=b; /* b , */ goto gate; } } } } } int FindInformation(MGraph *G,char a[])// { int i; for(i=1;i<=G->vexnum;i++) { if(strcmp(G->vexs[i].name,a)==0) break; } if(i==(G->vexnum+1)) { return -1; } else return G->vexs[i].num; } void Floyd(MGraph *G) { int v,u,i,w,k,j=0,flag=1,p[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM],D[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; char A[10],B[10]; for(v=1;v<=G->vexnum;v++) for(w=1;w<=G->vexnum;w++) { D[v][w]=G->arcs[v][w].adj; for(u=1;u<=G->vexnum;u++) p[v][w][u]=0; if(D[v][w]vexnum;u++) for(v=1;v<=G->vexnum;v++) for(w=1;w<=G->vexnum;w++) if(D[v][u]+D[u][w]vexnum;i++) p[v][w][i]=p[v][u][i]||p[u][w][i]; } printf("\t :
"); scanf("%s",&A); k=FindInformation(G,A); if(k==-1){ printf("\t !
"); return ; } printf("\t :
"); scanf("%s",&B); k=FindInformation(G,B); if(j==-1){ printf("\t !
"); return ; } printf("%s",G->vexs[k].name); for(u=1;u<=G->vexnum;u++) if(p[k][j][u]&&k!=u&&j!=u) printf("-->%s",G->vexs[u].name); printf("-->%s",G->vexs[j].name); printf(" %dm
",D[k][j]); }//Floyd end int a=0;/* , */ int visited[MAX_VERTEX_NUM];/* , */ int v[MAX_VERTEX_NUM];/* , */ void path(MGraph *G,int i,int j,int k) /* k+1 */ {int s; if(v[k]==j)/* */ { a++;/* 1*/ printf(" %d :",a); for(s=1;s",G->vexs[v[s]].name); printf("%s
",G->vexs[v[s]].name); } s=1; while(s<=G->vexnum) {if(s!=i)/* */ { if(G->arcs[v[k]][s].adj!=INFINITY&&visited[s]==0) /* vk vs vs */ {visited[s]=1;/* 1, */ v[k+1]=s;/* s v */ path(G,i,j,k+1);/* */ visited[s]=0;/* 0, , */ }} s++; } } void disppath(MGraph *G,int i,int j) { int k; v[1]=i; for(k=1;k<=G->vexnum;k++) visited[i]=0;/* , */ a=0;/* */ path(G,i,j,1);/* path , vi vj */ } void SearchAllpath(MGraph *G)/* */ { int i,j; char b[10],c[10]; printf(" :"); scanf("%s",&b); i=FindInformation(G,b); getchar(); if(i==-1) { printf(" !
"); return; } printf(" :"); scanf("%s",&c); j=FindInformation(G,c); getchar(); if(j==-1) { printf(" !
"); return; } printf(" %s %s :
",G->vexs[i].name,G->vexs[j].name);/* */ disppath(G,i,j);/* disppath , */ } char SearchMenu() /* */ { char c; int flag; do{ flag=1; system("cls"); printf("
\t\t┏━━━━━━━━━━━━━━━┑
"); printf("\t\t\t┃ ┃
"); printf("\t\t\t┃ 1、 ┃
"); printf("\t\t\t┃ 2、 ┃
"); printf("\t\t\t┃ 0、 ┃
"); printf("\t\t\t┃ ┃
"); printf("\t\t\t┗━━━━━━━━━━━━━━━┛
"); printf("\t\t\t\t :"); scanf("%c",&c); if(c=='1'||c=='2'||c=='0') flag=0; }while(flag); return c; } void search(MGraph *G) /* */ { int num; int i; char c; char name[20]; do { system("cls"); c=SearchMenu(); switch (c) { case '1': system("cls"); printf("

\t\t :"); scanf("%d",&num); for(i=1;i<=MAX_VERTEX_NUM;i++) { if(num==G->vexs[i].num) { printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓
"); printf("┃ ┃ ┃ ┃
"); printf("┃%-4d %-16s┃%-56s┃
",G->vexs[i].num,G->vexs[i].name,G->vexs[i].introduction); printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━┛
"); printf("
\t\t\t ..."); getchar(); getchar(); break; } } if(i==MAX_VERTEX_NUM) { printf("

\t\t\t !"); printf("

\t\t\t ..."); getchar(); getchar(); } break; case '2': system("cls"); printf("

\t\t :"); scanf("%s",&name); for(i=1;i<=MAX_VERTEX_NUM;i++) { if(!strcmp(name,G->vexs[i].name)) { printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓
"); printf("┃ ┃ ┃ ┃
"); printf("┃%-4d %-16s┃%-56s┃
",G->vexs[i].num,G->vexs[i].name,G->vexs[i].introduction); printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━┛
"); printf("
\t\t\t ..."); getchar(); getchar(); break; } } if(i==MAX_VERTEX_NUM) { printf("

\t\t\t !"); printf("

\t\t\t ..."); getchar(); getchar(); } break; } }while(c!='0'); } void Menu() { printf("

"); printf(" ┏━━━━━━━━━━━━━━━━━━━━┓
"); printf(" ┃ 1. ┃
"); printf(" ┃ 2. ┃
"); printf(" ┃ 3. ┃
"); printf(" ┃ 4. ┃
"); printf(" ┃ 5. ┃
"); printf(" ┗━━━━━━━━━━━━━━━━━━━━┛
"); printf(" :"); } void Browser(MGraph *G) { int i; printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓
"); printf("┃ ┃ ┃ ┃
"); for(i=1;i<=G->vexnum;i++) printf("┃%-4d┃%-16s┃%-56s┃
",G->vexs[i].num,G->vexs[i].name,G->vexs[i].introduction); printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━┛
"); } void main(void) { int i; int v0,v1; G=(MGraph *)malloc(sizeof(MGraph)); G=CreatUDN(G); Menu(); scanf("%d",&i); while(i!=5) { switch(i) { case 1:system("cls");Browser(G);Menu();break; case 2:system("cls"); printf("

\t\t\t :"); scanf("%d",&v0); printf("\t\t\t :"); scanf("%d",&v1); ShortestPath_DIJ(G,v0); /* */ output(v0,v1); /* */ Menu();break; case 3:system("cls"); // Floyd(G); SearchAllpath(G); Menu();break; case 4:system("cls");search(G);Menu();break; case 5:exit(1);break; default:break; } scanf("%d",&i); } }