返回列表 發帖
  1. #include<iostream>
  2. #include<fstream>

  3. using namespace std ;

  4. const int M = 9999 ; // far way
  5.    
  6. int main()
  7. {
  8.     ifstream fin("pb.in") ;
  9.    
  10.     int p,v,start,end ; // 寬度,總點數,起始點編號,終點編號
  11.     p = 5 ;
  12.     v = p*p ; // 題目給的 5x5的diagram
  13.     int map[v][v] ;
  14.     int parent[v] ;
  15.     int visit[v] ;
  16.     int d[v] ;   
  17.     // init map and draw map
  18.     for( int i = 0 ; i < v ; i ++ )
  19.     {
  20.         for( int j = 0 ; j < v ; j ++ )     
  21.         {
  22.             map[i][j] = M ;     
  23.         }
  24.         visit[i] = false ;
  25.         d[i] = M ;
  26.     }   
  27.     // read pb.in diagram            
  28.     for( int i = 0 ; i < v ; i ++ )
  29.     {
  30.         string x ;
  31.         fin >> x ;
  32.         if( x == "e" ) end = i ;
  33.         if( x == "s" ) start = i ;                     
  34.         if( x == "x" ) visit[i] = true ;
  35.     }   
  36.      
  37.     // check diagram
  38.     for( int i = 0 ; i < v ; i ++ )
  39.     {
  40.         if( i%p != p-1 && !visit[i+1] )
  41.         {
  42.             map[i][i+1] = 1 ;
  43.             map[i+1][i] = 1 ;   
  44.         }
  45.         if( i%p != 0 && !visit[i-1] )
  46.         {
  47.             map[i][i-1] = 1 ;
  48.             map[i-1][i] = 1 ;   
  49.         }
  50.         if( i >= p && !visit[i-p] )            
  51.         {
  52.             map[i][i-p] = 1 ;
  53.             map[i-p][i] = 1 ;   
  54.         }
  55.         if( i < (p-1)*p && !visit[i+p] )
  56.         {
  57.             map[i][i+p] = 1 ;
  58.             map[i+p][i] = 1 ;
  59.         }  
  60.     }
  61.    
  62. /*    for( int i = 0 ; i < v ; i ++ )
  63.     {
  64.         for( int j = 0 ; j < v ; j ++ )     
  65.         {
  66.             cout << map[i][j] << " " ;     
  67.         }
  68.         cout << endl ;
  69.     }
  70.     cout << start << "-" << end << endl ;  */
  71.                      
  72.     // dijkstra
  73.     d[start] = 0 ;
  74.     parent[start] = start ;
  75.     for( int i = 0 ; i < v ; i ++ )
  76.     {
  77.          int min = M ;
  78.          int index = -1 ;
  79.          for( int j = 0 ; j < v ; j ++ )
  80.          {
  81.              if( !visit[j] && d[j] < min )
  82.              {
  83.                  min = d[j] ;
  84.                  index = j ;
  85.              }     
  86.          }
  87.          
  88.          if( index == -1 ) break ;
  89.          visit[index] = true ;
  90.          for( int j = 0 ; j < v ; j ++ )
  91.          {
  92.              if( !visit[j] && ( d[index] + map[index][j] < d[j] ) )     
  93.              {
  94.                  d[j] = d[index] + map[index][j] ;
  95.                  parent[j] = index ;                    
  96.    
  97.              }
  98.          }   
  99.     }
  100. /*    for( int i = 0 ; i < v ; i ++ )
  101.     {
  102.         cout << d[i] << " " ;
  103.     }
  104.     cout << endl ; */
  105.     //for( int i = 0 ; i < v ; i ++ )
  106.     //{
  107.         int pre = end ;           
  108.         cout << pre << "->" ;         
  109.         while( parent[pre] != pre )
  110.         {
  111.            pre = parent[pre] ;
  112.            cout << pre << "->" ;
  113.         }
  114.         cout << "cost" << d[end] << endl ;
  115.     //}
  116.      
  117.    
  118.     system("Pause") ;
  119. }
複製代碼
我是來去無蹤的..

                                ..士豪(Alen)黑輪

TOP

返回列表