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
| #include<stdio.h> #include<stdlib.h> #include<memory.h> #define MAX_VEX 9 #define INFINITY 9999 int g[MAX_VEX][MAX_VEX] = {INFINITY}; void init() { memset(g,INFINITY,sizeof(g)); FILE * fp = fopen("edge.txt","r"); if(!fp) { printf("edge.txt not exists!\n"); return ; } while(!feof(fp)) { int l,r,val; fscanf(fp,"%d",&l); fscanf(fp,"%d",&r); fscanf(fp,"%d",&val); g[l][r] = val; g[r][l] = val; } int i,j; for(i = 0;i<MAX_VEX;i++) { for(j = 0;j<MAX_VEX;j++) { printf("g[%d][%d]=%d ",i,j,g[i][j]); } printf("\n"); } fclose(fp); }
void DIJ(int v0,int dst) { int final[MAX_VEX] = {0}; int path[MAX_VEX] = {0}; int dis[MAX_VEX] = {0}; int n = MAX_VEX; int i,k,tmp; for(i =0;i<n;i++) { g[i][i] = 0; if(g[v0][i]==0 || g[v0][i] ==INFINITY) path[i] = 0; else path[i] = v0; dis[i] = g[v0][i]; }
for(i=0;i<n;i++) { int min = INFINITY*2; if(i==v0) continue; for(k=0;k<n;k++) { if(!final[k] && dis[k] <min) { min = dis[k]; tmp = k; } } final[tmp] = 1;
for(k=0;k<n;k++) { if(!final[k] && min+g[tmp][k] <dis[k]) { dis[k] = min +g[tmp][k]; path[k] = tmp; } } }
int trace[MAX_VEX]; int tot= 0; trace[tot++] = dst; int temp = path[dst]; while(temp!=v0)
{ trace[tot++] = temp; temp = path[temp]; } trace[tot] = v0; for(k = tot;k>=0;tot--) { if(trace[tot]==dst) { printf("%d\n",dst); break; } else { printf("%d->",trace[tot]); } }
}
int main() { init(); DIJ(0,3); return 0; }
|