-
Notifications
You must be signed in to change notification settings - Fork 0
/
Floyd.c
134 lines (116 loc) · 2.71 KB
/
Floyd.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include<stdio.h>
#include<stdlib.h>
#define Inf 999
// void Init(int **buffet,int **path,int n,int m);
// void quit(int **buffet,int n);
// void Floyd(int **buffet,int **path,int n);
void main()
{
int n,m;
int i,j,k,com,x,y;
printf("Please input the number of Vertex and Edge:");
scanf("%d %d",&n,&m);
int **buffet;
int **path;
buffet = (int**)malloc(sizeof(int*)*(n+1));
path = (int**)malloc(sizeof(int*)*(n+1));
for(i=0;i<n+1;i++){
buffet[i] = (int*)malloc(sizeof(int)*(n+1));
path[i] = (int*)malloc(sizeof(int)*(n+1));
}
//矩阵的初始化
for(i=0;i<n;i++){
for(j=0;j<n;j++){
path[i][j] = j; //有边相连的两点,前一点指向后一点
buffet[i][j] = Inf;
}
}
//矩阵的赋值
for(i=0;i<m;i++){
scanf("%d %d",&x,&y);
scanf("%d",&buffet[x-1][y-1]);
}
for(k=0;k<n;k++){
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(buffet[i][k] + buffet[k][j] < buffet[i][j]){
buffet[i][j] = buffet[i][k] + buffet[k][j];
//递归调用,两块 和中间一点相连指向中间一点
path[i][j] = path[i][k];
}
}
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(buffet[i][j] != Inf && i!=j){
printf("%d -> %d distance: %d\n",i+1,j+1,buffet[i][j]);
com = i;
while(com!=j){
printf("%d -> " ,com+1);
com = path[com][j];
}
printf("%d\n\n",j+1);
}
}
}
for(i=0;i<n;i++){
free(buffet[i]);
}
free(buffet);
for(i=0;i<n;i++){
free(path[i]);
}
free(path);
return;
}
// void Init(int **buffet,int **path,int n,int m){ //动态二维数组初始化
// int i,j,x,y;
// //赋予地址
// buffet = (int**)malloc(sizeof(int*)*n);
// path = (int**)malloc(sizeof(int*)*n);
// for(i=0;i<n;i++){
// buffet[i] = (int*)malloc(sizeof(int)*n);
// path[i] = (int*)malloc(sizeof(int)*n);
// }
// //矩阵的初始化
// for(i=0;i<n;i++){
// for(j=0;j<n;j++){
// path[i][j] = 0; //都没有路径
// if(i==j){
// buffet[i][j] = 0; //矩阵对角线为0,
// }
// else{
// buffet[i][j] = Inf; //矩阵值无限大
// }
// }
// }
// //矩阵的赋值
// for(i=0;i<m;i++){
// scanf("%d %d %d",&x,&y,&buffet[x-1][y-1]);
// path[x][y] = y; //有边相连的两点,前一点指向后一点
// }
// }
//释放空间
// void quit(int **buffet,int n){
// int i;
// for(i=0;i<n;i++){
// free(buffet[i]);
// }
// free(buffet);
// }
//Floyd函数主体
// void Floyd(int **buffet,int **path,int n){
// int i,j,k;
// for(k=0;k<n;k++){
// for(i=0;i<n;i++){
// for(j=0;j<n;j++){
// if(buffet[i][k] + buffet[k][j] < buffet[i][j]){
// buffet[i][j] = buffet[i][k] + buffet[k][j];
// //递归调用,两块 和中间一点相连指向中间一点
// path[i][j] = path[i][k];
// }
// }
// }
// }
// }