131 lines
2.9 KiB
C
131 lines
2.9 KiB
C
|
/*
|
|||
|
Program: all-pairs-shortest-path-v2.c (Report comments/bugs to chikh@yuntech.edu.tw)
|
|||
|
Function: <EFBFBD>ק<EFBFBD>all-pairs-shortest-path-v1.c<EFBFBD>ϱoA<EFBFBD>PY<EFBFBD>x<EFBFBD>}<EFBFBD><EFBFBD><EFBFBD>̹Ϥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>`<EFBFBD>Ƨ@<EFBFBD>t<EFBFBD>m<EFBFBD>A<EFBFBD>קK
|
|||
|
<EFBFBD>w<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>m<EFBFBD>L<EFBFBD>j<EFBFBD><EFBFBD>100x100<EFBFBD>}<EFBFBD>C<EFBFBD>Ŷ<EFBFBD><EFBFBD>ӧΦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>O
|
|||
|
*/
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h> /* for exit() */
|
|||
|
|
|||
|
#define Inf 1073741823 /* <20><><EFBFBD><EFBFBD>2^30-1<><31><EFBFBD>j<EFBFBD>Ʀr<C6A6>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD>]<5D><><EFBFBD>L<EFBFBD><4C><EFBFBD>j<EFBFBD>ȡF<C8A1>i<EFBFBD><69><EFBFBD><EFBFBD>limits.h<>w<EFBFBD>q<EFBFBD><71>INT_MAX */
|
|||
|
|
|||
|
void init(int ***A, int ***Y) /* Ū<><C5AA><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>ɡB<C9A1>]<5D>w<EFBFBD>۾F<DBBE>x<EFBFBD>}<7D>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>c<EFBFBD>@<40><><EFBFBD>l<EFBFBD><6C> */
|
|||
|
{
|
|||
|
FILE *fptr;
|
|||
|
int i, j;
|
|||
|
int weight, N;
|
|||
|
|
|||
|
if ((fptr=fopen("shortestPath.dat","r")) == NULL) { /* <20>}<7D>Ҹ<EFBFBD><D2B8><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
perror("shortestPath.dat");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
fscanf(fptr,"%d",&N); /* Ū<><C5AA><EFBFBD>ϧθ`<60>I<EFBFBD><49> */
|
|||
|
|
|||
|
*A = (int **)malloc((N+1)*sizeof(int *));
|
|||
|
*Y = (int **)malloc((N+1)*sizeof(int *));
|
|||
|
for (i = 0; i <= N; i++) {
|
|||
|
(*A)[i] = (int *)malloc((N+1)*sizeof(int));
|
|||
|
(*Y)[i] = (int *)malloc((N+1)*sizeof(int));
|
|||
|
}
|
|||
|
|
|||
|
(*A)[0][0] = N;
|
|||
|
for (i = 1; i <= N; i++ )
|
|||
|
for (j = 1; j <= N; j++) {
|
|||
|
(*A)[i][j] = (i==j)? 0: Inf; /* <20><><EFBFBD>l<EFBFBD><6C>A[1..N][1..N]<5D>۾F<DBBE>x<EFBFBD>}<7D>A<EFBFBD>Ҧ<EFBFBD><D2A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>w<EFBFBD>]<5D><><EFBFBD><EFBFBD> */
|
|||
|
(*Y)[i][j] = (i==j)? i: -1;
|
|||
|
}
|
|||
|
|
|||
|
while (fscanf(fptr,"%d %d %d",&i,&j,&weight) != EOF) {
|
|||
|
(*A)[i][j] = weight; /* Ū<><C5AA><EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD>Ii<49>Pj<50><6A><EFBFBD>䪺<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD> */
|
|||
|
(*Y)[i][j] = i;
|
|||
|
}
|
|||
|
|
|||
|
fclose(fptr);
|
|||
|
}
|
|||
|
|
|||
|
void floydWarshall(int ***A, int ***Y)
|
|||
|
{
|
|||
|
int i, j, k;
|
|||
|
int N = (*A)[0][0]; //<2F>L<EFBFBD>k<EFBFBD>ϥ<EFBFBD>sizeof(A[0])/sizeof(A[0][0])<29>PŪ<50><C5AA><EFBFBD>סA<D7A1>]<5D>Hmalloc()<29>t<EFBFBD>m<EFBFBD>ұo<D2B1>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>㵲<EFBFBD>c
|
|||
|
|
|||
|
for (k = 1; k <= N; k++)
|
|||
|
for (i = 1; i <= N; i++)
|
|||
|
for (j = 1; j <= N; j++)
|
|||
|
if ((*A)[i][k] + (*A)[k][j] < (*A)[i][j]) {
|
|||
|
(*A)[i][j] = (*A)[i][k] + (*A)[k][j];
|
|||
|
(*Y)[i][j] = (*Y)[k][j];
|
|||
|
}
|
|||
|
//<2F>W<EFBFBD><57><EFBFBD>G<EFBFBD>hfor<6F>j<EFBFBD><6A><EFBFBD>Ω<EFBFBD><CEA9>˵<EFBFBD>/<2F>ץ<EFBFBD><D7A5>C<EFBFBD>G<EFBFBD><47><EFBFBD>I(i,j)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>g<EFBFBD><67>k(<28><><EFBFBD>~<7E><><EFBFBD>I)<29><><EFBFBD>o<EFBFBD><6F><EFBFBD>p<EFBFBD>Z<EFBFBD><5A><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
void printMatrix(int **A)
|
|||
|
{
|
|||
|
int i, j;
|
|||
|
int N = A[0][0];
|
|||
|
|
|||
|
for (i = 1; i <= N; i++) {
|
|||
|
for (j = 1; j <= N; j++) {
|
|||
|
if (A[i][j] == Inf)
|
|||
|
printf("%5s","<EFBFBD><EFBFBD>");
|
|||
|
else
|
|||
|
printf("%4d",A[i][j]);
|
|||
|
}
|
|||
|
printf("\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void backtrack(int **Y, int source, int dest)
|
|||
|
{
|
|||
|
int k = Y[source][dest];
|
|||
|
|
|||
|
if (source == dest) {
|
|||
|
printf("<EFBFBD><EFBFBD><EFBFBD>I%d <20><>",source);
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Y[source][dest] == -1) {
|
|||
|
printf("<EFBFBD><EFBFBD><EFBFBD>I%d<>P%d<><64><EFBFBD><EFBFBD><EFBFBD>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD>|<7C>s<EFBFBD>b ",source,dest);
|
|||
|
return;
|
|||
|
}
|
|||
|
backtrack(Y,source,k);
|
|||
|
printf(" %d <20><>",dest);
|
|||
|
}
|
|||
|
|
|||
|
void traverseMatrix(int **Y)
|
|||
|
{
|
|||
|
int i, j, k, source, sink;
|
|||
|
|
|||
|
printf("\n<EFBFBD><EFBFBD><EFBFBD>I => ");
|
|||
|
scanf("%d",&source);
|
|||
|
printf("<EFBFBD><EFBFBD><EFBFBD>I => ");
|
|||
|
scanf("%d",&sink);
|
|||
|
|
|||
|
printf("<EFBFBD>̵u<EFBFBD><EFBFBD><EFBFBD>|<7C>G");
|
|||
|
backtrack(Y,source,sink);
|
|||
|
printf("\b\b ");
|
|||
|
}
|
|||
|
|
|||
|
void freeMemory(int **A, int **Y)
|
|||
|
{
|
|||
|
int i, N = A[0][0];
|
|||
|
|
|||
|
for (i = 0; i <= N; i++) {
|
|||
|
free(A[i]);
|
|||
|
free(Y[i]);
|
|||
|
}
|
|||
|
free(A);
|
|||
|
free(Y);
|
|||
|
}
|
|||
|
|
|||
|
int main() {
|
|||
|
int **A, **Y;
|
|||
|
|
|||
|
init(&A,&Y); /* Ū<><C5AA><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>ɡB<C9A1>]<5D>w<EFBFBD>۾F<DBBE>x<EFBFBD>}<7D>A<EFBFBD>ç<EFBFBD><C3A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>c<EFBFBD>@<40><><EFBFBD>l<EFBFBD><6C> */
|
|||
|
floydWarshall(&A,&Y);
|
|||
|
printMatrix(A);
|
|||
|
traverseMatrix(Y);
|
|||
|
freeMemory(A,Y);
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|