代码改变世界

Sicily/1703. Obstacle Course

2011-07-31 22:06  Min·zc  阅读(219)  评论(0编辑  收藏  举报
最短路径算法

     dijkstra最短路径算法     这个算法是再一个连通的带权图中寻找从顶点a到顶点z的最短路径的长度。边(i,j)的权值w(i,j)>0,且顶点x的标记为L(x)。在结束时,L(z)是从a到z的最短路径的长度。

     dijkstra(w,a,z,L)
     {
          L(a)=0;
          for     所有的顶点 x !=a
               L(a)= 正无穷
          T = 图所有顶点
          whie(z 属于 T)
          {
               从T中找出L(x)最小的顶点x
               T = T -{x}
               for 所有与x相邻的顶点v属于T
               {
                    L(v) = min(L(v),L(x)+w(x,v))
               }
          }
     } 

     对于一个n的顶点的完全连通图,最坏时间复杂度为n^2

 

 

 1 #include <iostream>
 2 #include <memory.h>
 3 using namespace std;
 4 int dis[15630];
 5 int vi[15630];
 6 int gp[130][130];
 7 int n;
 8 int time=0;
 9 int change(int p,int d)
10 {
11         int x=p/n;
12         int y=p%n;
13         if(d==0)
14                 y--;
15         else if(d==1)
16                 x--;
17         else if(d==2)
18                 y++;
19         else
20                 x++;
21         if(x<0||x>n||y<0||y>n)
22                 return -1;
23         else
24                 return x*n+y;
25 }
26 int ini()
27 {
28         for(int i=0;i<n;i++)
29                 for(int j=0;j<n;j++)
30                         cin>>gp[i][j];
31 }
32 int dij()
33 {
34         memset(vi,0,sizeof(vi));
35         for(int i=1;i<n*n;i++)
36                 dis[i]=999999;
37         dis[0]=0;
38         while(vi[n*n-1]==0)
39         {
40                 int min=999999;
41                 int t;
42                 for(int i=0;i<n*n;i++)
43                         if(vi[i]==0&&dis[i]<min)
44                         {
45                                 min=dis[i];
46                                 t=i;
47                         }
48                 vi[t]=1;
49                 dis[0]=gp[0][0];
50         //     cout<<t<<endl;
51                 for(int d=0;d<4;d++)
52                 {
53                         int tem=change(t,d);
54                         if(tem!=-1)
55                         {
56                                 int x,y;
57                                 x=tem/n;
58                                 y=tem%n;
59                                 dis[tem]=gp[x][y]+dis[t]<dis[tem]?gp[x][y]+dis[t]:dis[tem];
60                         //   cout<<tem<<" "<<dis[tem]<<endl;
61                         }
62                 }
63         }
64         time++;
65         cout<<"Problem "<<time<<": "<<dis[n*n-1]<<endl;
66 }
67 int main()
68 {
69         while(cin>>n&&n!=0)
70         {
71                 ini();
72                 dij();
73         }
74 }