生活随笔
收集整理的這篇文章主要介紹了
数据结构——图-最短路径长度中最大的一个
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include<stdio.h>
#include<string.h>
#define INF 32767
#define MAXVEX 30
int dist
[MAXVEX
]; int path
[MAXVEX
]; int S
[MAXVEX
]; typedef char VertexType
;typedef struct graph
{int n
,e
;VertexType vexs
[MAXVEX
];int edges
[MAXVEX
][MAXVEX
];
}MGraph
;void CreateMGraph(MGraph
&G
)
{int n
,e
;int value
;char temp_i
;char temp_j
;printf("請輸入圖的頂點數和邊數(以空格分隔):");scanf("%d%d",&n
,&e
);G
.n
=n
;G
.e
=e
;for(int i
=0;i
<n
;i
++){for(int j
=0;j
<n
;j
++){if(i
==j
)G
.edges
[i
][j
]=0;elseG
.edges
[i
][j
]=32767;}}printf("輸入頂點信息:");for(int j
=0;j
<G
.n
;j
++){getchar();scanf("%c",&G
.vexs
[j
]);}int temp_number_i
;int temp_number_j
;printf("請輸入每條邊的權值:\n");for(int j
=0;j
<e
;j
++){getchar();scanf("%c %c %d",&temp_i
,&temp_j
,&value
);for(int i
=0;i
<n
;i
++){if(G
.vexs
[i
]==temp_i
)temp_number_i
=i
;if(G
.vexs
[i
]==temp_j
)temp_number_j
=i
;}G
.edges
[temp_number_i
][temp_number_j
]=value
;}}void DispMGraph(MGraph
&G
)
{printf("輸出頂點信息:\n");for(int i
=0;i
<G
.n
;i
++){printf("%c",G
.vexs
[i
]);} printf("\n輸出鄰接矩陣:\n");printf("\t");for(int i
=0;i
<G
.n
;i
++)printf("%8c",G
.vexs
[i
]); for(int i
=0;i
<G
.n
;i
++){printf("\n%8c",G
.vexs
[i
]);for(int j
=0;j
<G
.n
;j
++){if(G
.edges
[i
][j
]==32767) printf("%8s", "∞");elseprintf("%8d",G
.edges
[i
][j
]);}printf("\n");}
}void Dijkstra(MGraph g
, int v
)
{ int mindis
,i
,j
,u
=0;for (i
=0;i
<g
.n
;i
++){ dist
[i
]=g
.edges
[v
][i
]; S
[i
]=0; if (g
.edges
[v
][i
]<INF
) path
[i
]=v
; else path
[i
]=-1;}S
[v
]=1; for (i
=0;i
<g
.n
-1;i
++) { mindis
=INF
; for (j
=0;j
<g
.n
;j
++) if (S
[j
]==0 && dist
[j
]<mindis
) { u
=j
;mindis
=dist
[j
];}S
[u
]=1; for (j
=0;j
<g
.n
;j
++) if (S
[j
]==0)if (g
.edges
[u
][j
]<INF
&& dist
[u
]+g
.edges
[u
][j
]<dist
[j
]){ dist
[j
]=dist
[u
]+g
.edges
[u
][j
];path
[j
]=u
;}}
}void Print(MGraph G
,int v
)
{printf("\n");for(int i
=0;i
<G
.n
;i
++){if(i
!=v
&& dist
[i
]!=INF
){printf("%c到%c的最短距離為:%d\n",G
.vexs
[v
],G
.vexs
[i
],dist
[i
]);}else if(dist
[i
]==INF
){printf("%c與%c之間無路徑!\n",G
.vexs
[v
],G
.vexs
[i
]); } }printf("\n");
}
static void Dispath(MGraph g
, int v
)
{int i
, j
, k
;int apath
[MAXVEX
], d
; for(i
= 0; i
< g
.n
; i
++){if(S
[i
] == 1 && i
!= v
){printf("從頂點%c到頂點%c的路徑長度為:%d\t路徑為:", g
.vexs
[v
], g
.vexs
[i
], dist
[i
]);d
= 0; apath
[d
] = i
; k
= path
[i
];if(k
== -1) printf("無路徑\n");else {while(k
!= v
){d
++;apath
[d
] = k
;k
= path
[k
];}d
++; apath
[d
] = v
; printf("%c ", g
.vexs
[apath
[d
]]); for(j
= d
- 1; j
>= 0; j
--) printf(" %c ", g
.vexs
[apath
[j
]]);printf("\n");}}}
}
static void Dispath2(MGraph g
, int v
,int w
)
{int i
, j
, k
;int apath
[MAXVEX
], d
; for(i
= 0; i
< g
.n
; i
++){if(S
[i
] == 1 && i
!= v
&&i
==w
){printf("%d\n",dist
[i
]);d
= 0; apath
[d
] = i
; k
= path
[i
];if(k
== -1) printf("無路徑\n");else {while(k
!= v
){d
++;apath
[d
] = k
;k
= path
[k
];}d
++; apath
[d
] = v
; printf("%c ", g
.vexs
[apath
[d
]]); for(j
= d
- 1; j
>= 0; j
--) printf(" %c ", g
.vexs
[apath
[j
]]);printf("\n");}}}
}void min_shortest_path(MGraph G
,int v
)
{int mindist
=dist
[0];int temp
;for(int i
=1;i
<G
.n
;i
++){if(mindist
<dist
[i
]){mindist
=dist
[i
];temp
=i
;}}printf("圖中距離頂點%c最短路徑長度中最大的為:",G
.vexs
[v
]);Dispath2(G
, v
,temp
);}
int main()
{MGraph G
;CreateMGraph(G
);DispMGraph(G
);Dijkstra(G
,0);Print(G
,0);Dispath(G
,0);min_shortest_path(G
,0);
}
總結
以上是生活随笔為你收集整理的数据结构——图-最短路径长度中最大的一个的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。