动态规划求有向无环图的单源最短路径

问题描述如下:


 

 


 

具体代码实现:

 1 #include<stdlib.h>
 2 #include<stdio.h>
 3 #define x 9999
 4 #define max 9999
 5 int data[10][10];
 6 int dist[10];//记录最短路径为多少
 7 int path[10];//记录最短路径
 8 int kmin(int,int);
 9 void fpath(int a[][10]);
10 int froute(int a[][10]);
11 void main()
12 {
13     int i,m;
14     int a[10][10]={
15     {x,4,2,3,x,x,x,x,x,x},
16     {x,x,x,x,10,9,x,x,x,x},
17     {x,x,x,x,6,7,10,x,x,x},
18     {x,x,x,x,x,3,8,x,x,x},
19     {x,x,x,x,x,x,x,4,8,x},
20     {x,x,x,x,x,x,x,9,6,x},
21     {x,x,x,x,x,x,x,5,4,x},
22     {x,x,x,x,x,x,x,x,x,8},
23     {x,x,x,x,x,x,x,x,x,4},
24     {x,x,x,x,x,x,x,x,x,x}};
25 
26     /*for (i=0;i<10;i++)
27     {
28         for(j=0;j<10;j++)
29         printf("%d  ",a[i][j]);
30         printf("\n");
31     }*/
32     fpath(a);
33         printf("最短路径大小为:  %d\n",dist[9]);
34 
35     m=froute(a);
36     for(i=m-1;i>=0;i--)
37         printf("最短路径经过:   %d\n",path[i]);
38 }
39 void fpath(int a[][10])
40 {
41     int i,j,k;
42     dist[0]=0;
43     for(i=1;i<10;i++)
44     {
45         k=max;
46         for(j=0;j<i;j++)
47         {
48             if(a[j][i]!=x)
49                 if((dist[j]+a[j][i])<k)
50                     k=dist[j]+a[j][i];    
51         }
52         dist[i]=k;
53     }
54 }
55 int froute(int a[][10])
56 {
57     int j,b,k=1,i=9;
58     path[0]=10;
59     while(i>0)
60     {
61         for(j=i-1;j>=0;j--)
62         {
63             if(a[j][i]!=x)
64             {
65                 b=dist[i]-a[j][i];
66                 if(b==dist[j])
67                 {
68                     path[k++]=j+1;
69                     i=j;
70                     break;
71                 }
72             }
73 
74         }
75     }
76         return k;
77 }
78 
79 
80             

 

posted @ 2012-04-17 11:23  lpshou  阅读(10495)  评论(2编辑  收藏  举报