两天没传东西了,有点罪恶感。今天看了些密码学的东西,发现那东西,说复杂也确实是,说简单好像也挺简单,主要也就是与、或、非、异或等各种变换。等有时间了自己好好写写。
先说说,今天写的最短路径,也就是搜索,先小区域找,滚雪球,再找,确定最小的。OK!理解思想了,程序也就好说了。上代码:
1 /*dijkstra算法*/ 2 #include <stdio.h> 3 4 #define MAXNODE 30 5 #define MAXCOST 1000 6 int dist[MAXNODE]; 7 int cost[MAXNODE][MAXNODE]; 8 int n=5; 9 void dijkstra(int vbegin); 10 void display(int vbegin); 11 int main() 12 { 13 int i,j,vbegin=1; 14 for(i=1;i<=n;i++) 15 { 16 for(j=1;j<=n;j++) 17 { 18 cost[i][j]=MAXCOST; 19 } 20 } 21 /*到自己处为0*/ 22 for(i=1;i<=n;i++) 23 { 24 cost[i][i]=0; 25 } 26 cost[1][2] = 10; 27 cost[1][5] = 100; 28 cost[1][4] = 30; 29 cost[2][3] = 50; 30 cost[3][5] = 80; 31 cost[4][3] = 20; 32 cost[4][5] = 60; 33 dijkstra(3); 34 display(3); 35 return 0; 36 } 37 void dijkstra(int vbegin) 38 { 39 int flag[MAXNODE];//访问标示,0-未访问,1-访问 40 int mindis,dis,i,j,u; 41 /*初始化*/ 42 for(i = 1;i<=n;i++) 43 { 44 dist[i] = cost[vbegin][i];/*给路径赋值*/ 45 flag[i] = 0; 46 } 47 flag[vbegin] = 1; 48 49 /*求最短路径*/ 50 for(i=1;i<=n;i++) 51 { 52 mindis = MAXCOST;/*最段路径设为最大*/ 53 /*处理单节点*/ 54 for(j = 1;j <= n;j++) 55 { 56 if(flag[j] == 0&& dist[j] < mindis) 57 { 58 u = j; 59 mindis = dist[j]; 60 } 61 } 62 flag[u] = 1; 63 /*处理节点到达的问题*/ 64 for(j=1;j<=n;j++) 65 { 66 if(flag[j] == 0) 67 { 68 dis = dist[u]+cost[u][j];/*多个节点组合路径*/ 69 dist[j] = (dist[j]<dis)?dist[j]:dis; 70 } 71 } 72 } 73 } 74 void display(int vbegin) 75 { 76 int i; 77 printf("\nnode %dto every node the shortest path:\n",vbegin); 78 for(i=1;i<=n;i++) 79 { 80 printf("v%d->v%d:",vbegin,i); 81 if(dist[i] == MAXCOST) 82 { 83 printf("no road!\n"); 84 } 85 else 86 { 87 printf("%d\n",dist[i]); 88 } 89 } 90 }