青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

jake1036

圖算法-prim 與 Djkstra方法之間的區別

                       圖算法

一 PRIM算法與DIJKSTRA算法

    兩個算法之間都有相似性,都用到了堆結構,都是使用了貪心性質,所以容易混淆。

二 PRIM算法

  該算法定義一個數組key[] ,key[i]表示i節點到樹中某一節點最小的距離。

  思想:初始時生成樹為一個空樹,而堆Q為一個滿堆,所有的節點均在堆中。

             首先置key[r]=0,然后執行EXTRACT_MIN(Q) 函數,從堆中取出key[j]最小的元素。

             然后對所有與節點j相鄰的節點i,判斷w[i][j] < key[i] ,若小于則更新key[i]。

             注意更新完之后需要對key[i]重新執行siftup()操作,對堆進行調整。
            重復執行上述過程,知道堆Q為空。則結束執行 

            整個算法的復雜度為O(v * logv)              


 代碼如下:
 

   
    
#include<iostream> 
 
using namespace std ;
 
const int N = 9 ;
 
const int SIZE = 14 ;
 
int key[N] ; //表示路徑 
 int par[N] ;
 
int visit[N] ;

 
int matrix[N][N] ;
  
 
 
 
 
void primIni() //prim初始化函數 
 {
   
int i ;
   
for(i = 0 ; i < N ; i++)
   
{
        key[i] 
= 66536 ;
        par[i] 
= -1 ; //父節點 
        visit[i] = 0 ; //表示是否在Q中,在Q中則為1 
        
   }

   key[
0= 0 ;  
   
//visit[0] = 1;   
 }

 
 
 
//在Q堆中查找最小值  返回下標 
 int  findMin()
 
{
    
int min = 65536 ;   
    
int k = -1 ;  
   
for(int i = 0 ; i < N ;i++)
   
{
      
if(visit[i] == 0 )     
       
{
         
if(min > key[i])  
          
{
           min 
= key[i] ;              
           k 
= i ;
          }
  
       }
 
   }

     
     
return k ;    
    
 }

 
 
 
int prim()
 
{
   primIni() ;
   
int u ;
   
int x ;
   
while(1)
   
{
     u 
= findMin() ;
     
     
if(u == -1 ) //在Q中沒有找到 
        break ;
     x 
= u ; 
     printf(
"%c\n" , u + 'a');
     visit[u] 
= 1 ;//做標記   
     for(int i = 0 ; i < N ;i++ )  //在u的鄰接邊中找出最小值 
      {
        
if(visit[i] == 0 && matrix[u][i] > 0 && matrix[u][i] < key[i])    
           
{
              key[i] 
= matrix[u][i] ;  //當把一個新的節點加入樹中時,需要改變與其直接相鄰的節點 
              par[i] = u ;
           }
       
      }
 
             
   }

   
  
     
return x ;  
 }

 
 
void print(int u)
 
{
    
if(u!= -1)
    
{  
      print(par[u]);
      printf(
"%c ---->%c\n" ,par[u] + 'a' , u+'a');  
    }
 
 }

 
 
int main()
 
{
   
int i ;
  
   
char c1 ,c2 ;
   
int w ;
   memset(matrix , 
0 , sizeof(matrix)) ;
   
for(i = 0 ; i < SIZE ;i++)
   
{
     cin
>>c1>>c2>>w ;    
     matrix[c1
-'a'][c2-'a'= w ; //無向圖 所以每個節點均賦值   
     matrix[c2-'a'][c1-'a'= w ;        
   }
  
  
int u = prim();
   
   
//print(u) ;   
   system("pause") ;  
   
return 0 ;    
 }

 

三  Dijkstra算法 
 

      該算法使用了一個中間數據結構d[i] ,用來存儲節點i到源點的距離,初始時都設置為無窮大。
      構建一個堆,將所有的節點均存儲進堆中。堆中各個元素的大小關系,通過d[] 數組來確定。
    
      算法的步驟:
      (1) 首先置d[r]=0,然后將所有的頂點均插入進堆中。
      (2) 執行EXTRACT_MIN(Q) ,從堆中取d[i]值最小的節點i。 // v * LOGv
      (3) 判斷所有與i節點相鄰的節點v ,判斷d[v] > d[i] + w[i][v] ,若成立則更新d[v] = d[i] + w[i][v],更新完成之后,需要對堆中的d[v]元素執行siftup()操作。e*LOGv
      (4) 重復2,3直到堆Q為空。

      算法時間復雜度O(v * LOGv + e * LOG v )

 
     代碼如下:
    

/*
  初始S集合中,為空集合,從Q集合中選取最小的d的節點u,并將其加入到集合S中。
  然后更改與u相鄰的所有節點,調用relax。
  重復以上操作。
  這個算法本身是使用了談心策略 

*/
 

#include 
<iostream>
 
using namespace std ;
 
struct Node  //使用鄰接表存儲圖 
 {
   
int col ; //下一個節點 
   Node * link ;   
   
int w ;    
 }
 ;
 
 
const int N = 5 ;
 
int d[N] ;
 
int par[N] ;
 
const int MAX = 66536 ;
 
const int SIZE = 10 ;
 Node list[N] ;
 
int heap[N + 1] ;
 
int top ;  //標記堆中的元素個數 
 
 
//將元素插入堆中 
 void siftup(int u)
 
{
    
      
    heap[
++top] = u ; //將該元素插入進堆中的最后一個位置
                         
//然后向上移動,直到到達頂部  
    int i = top ;
    
int j = i / 2 ;
    
    
while(j > 0)
    
{   
       
if(d[heap[j]] > d[heap[i]]) 
       
{     
         swap(heap[i] , heap[j]) ;
         i 
= j ;
         j 
= j / 2 ;
        }
    
        
else
        
{
           
break ; 
        }

    }

      
      
 }

 
 
//將元素從堆中取出之后,將最后一個元素插入堆頭,然后向下移動 
 int minHeap()
 
{
    
if(top <= 0 )
      
return -1 ;
    
int u = heap[1] ;
    heap[
1= heap[top--] ; //將最末的一個節點移到堆的頭部 
    
//然后執行下移操作
    int i = 1 ;
    
int j = i * 2 ;
    
while(j <= top)
    
{
      
if(d[heap[i]] > d[heap[j]])      
       
{
         swap(heap[i] , heap[j]) ;
         i 
= j ;
         j 
= j * 2 ;                 
       }

       
else
       
{
         
break;     
       }
  
    }
 
        
    
return u ; //返回堆中的第一個元素  
 }

 
 
 
void iniDijkstra()
 
{
   
int i ;
   top 
= 0 ;
   
for(i = 0 ; i < N ;i++)
   
{
       
     d[i] 
= MAX ;
     par[i] 
= -1 ; 
     list[i].col 
= -1 ;
     list[i].link 
= 0 ;          
   }
      
   
   d[
0= 0 ; //對源點進行初始化 
   
   
for(i = 0 ; i < N ;i++//初始化堆操作s 
     siftup(i) ;
 }

 
 
void relax(int u , int v , int w)
 
{
     
if(d[v] > d[u] + w)
     
{
         d[v] 
= d[u] + w ;
         siftup(v) ;
         par[v] 
= u ;
     }
      
 }
 
 
 
void Dijkstra()
 
{
  
    
   
while(top > 0)
   
{   
     
int u = minHeap() ; //從集合Q中取出最小的d[u]。 
     Node * p = list[u].link ;
     
while(p)
     
{  
      relax(u , p
->col  , p->w) ; 
      p 
= p ->link ;        
     }

   }

        
 }

 
 
 
 
 
int main()
 
{
    
  
int i , j , e1 , e2 , w;
   iniDijkstra() ;   
  
for(i = 0 ; i < SIZE ; i++ ) //創建每一個鄰接表的節點 
  {
    cin
>>e1>>e2>>w ;
    Node 
* p = (Node *) malloc(sizeof(Node)) ;
    p
->col = e2 ;
    p
->= w ;   
    p
->link = list[e1].link ;
    list[e1].link 
= p ;
    
  }

   Dijkstra();
   
for(i = 0 ; i < N ;i++  )
   
{
     printf(
"%d " , d[i]) ;
   }

   
  system(
"pause") ;
   
return 0 ;    
 }

 


       



posted on 2011-05-03 09:31 kahn 閱讀(1161) 評論(0)  編輯 收藏 引用 所屬分類: 算法相關

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99v久久综合狠狠综合久久| 欧美日韩精品在线观看| 香蕉久久国产| 免费成人高清在线视频| 一本色道久久综合亚洲精品小说| 久久久久一区二区| 国产一区二区黄| 亚洲在线电影| 国产老肥熟一区二区三区| 久久国产88| 国产精品wwwwww| 亚洲免费观看高清完整版在线观看| 久久性色av| 欧美亚洲在线视频| 欧美黄色网络| 欧美激情视频在线免费观看 欧美视频免费一| 欧美日韩国产a| 日韩一区二区高清| 亚洲福利精品| 久久精品免费观看| 国产一区二区三区电影在线观看| 在线亚洲激情| 日韩一区二区久久| 欧美性久久久| 久久av一区二区| 欧美一区观看| 亚洲成人在线观看视频| 欧美韩日一区二区| 欧美国产一区二区三区激情无套| aa级大片欧美三级| 一区二区三区不卡视频在线观看 | 99精品视频一区二区三区| 久久久免费av| 久久人人97超碰国产公开结果| 雨宫琴音一区二区在线| 欧美成人精品在线播放| 欧美a级片一区| 正在播放欧美视频| 亚洲在线观看视频网站| 激情综合激情| 91久久国产自产拍夜夜嗨| 欧美日韩国产亚洲一区 | 亚洲视频在线一区观看| 国产精品网站在线观看| 久久这里有精品15一区二区三区| 免费在线国产精品| 99视频精品在线| 在线视频欧美日韩| 亚洲私人影院| 国内视频精品| 亚洲欧洲三级| 国产精品欧美一区二区三区奶水| 亚洲理论在线| 亚洲影院在线| 亚洲国产婷婷| 亚洲一区二区三区三| 黄色小说综合网站| 亚洲国产一区二区a毛片| 欧美午夜精品久久久久久孕妇| 久久久精品国产一区二区三区| 免费不卡在线视频| 亚洲欧美日韩在线综合| 裸体丰满少妇做受久久99精品| 亚洲深夜福利在线| 久久久蜜桃精品| 久久久91精品国产一区二区三区 | 欧美一区二区性| 亚洲在线电影| 性视频1819p久久| 久久精品道一区二区三区| 精品成人一区二区三区| 亚洲高清在线精品| 国产精品一区二区你懂的| 免费欧美日韩国产三级电影| 国产精品igao视频网网址不卡日韩| 久久全国免费视频| 99re8这里有精品热视频免费| 久久爱91午夜羞羞| 亚洲视频大全| 久久综合久久综合九色| 亚洲素人在线| 欧美中文字幕在线播放| 久久精品亚洲国产奇米99| 99视频精品在线| 欧美激情精品久久久久久| 久久精品99久久香蕉国产色戒 | 久久久国产精彩视频美女艺术照福利 | 国产精品成人免费视频 | 久久精品日产第一区二区| 亚欧成人精品| 日韩视频第一页| 亚洲人午夜精品| 欧美先锋影音| 老司机精品导航| 久久只有精品| 国产视频欧美| 中日韩高清电影网| 在线视频欧美精品| 欧美精品在线视频| 亚洲国产欧美另类丝袜| 国产伪娘ts一区| 久久久欧美精品| 欧美激情在线免费观看| 狠狠色丁香婷综合久久| 亚洲欧美国产77777| 欧美一级在线亚洲天堂| 久久在线观看视频| 欧美伊人久久久久久午夜久久久久| 99re热精品| 亚洲欧美成人精品| 亚洲另类一区二区| 亚洲日本中文字幕| 久久国产精品99精品国产| 久久人人爽爽爽人久久久| 欧美午夜精品久久久| 亚洲一区三区电影在线观看| 亚洲婷婷国产精品电影人久久| 欧美激情中文不卡| 日韩亚洲视频在线| 亚洲一区国产一区| 国产性做久久久久久| 久久久国产91| 亚洲精品美女久久7777777| 亚洲永久免费观看| 韩日精品视频一区| 欧美激情久久久| 亚洲综合首页| 欧美风情在线观看| 亚洲国产精品t66y| 欧美日韩亚洲国产一区| 亚洲国产一区二区三区青草影视| 亚洲免费播放| 午夜精品福利在线| 欧美成人亚洲成人| 亚洲欧美日本国产专区一区| 欧美日韩在线观看一区二区三区| 亚洲欧美日韩一区二区三区在线| 亚洲六月丁香色婷婷综合久久| 亚洲美女精品一区| 国产亚洲欧美日韩日本| 久久精品一区二区三区不卡牛牛| 亚洲全黄一级网站| 99re6这里只有精品视频在线观看| 国产精品video| 久久综合中文色婷婷| 亚洲免费大片| 老鸭窝毛片一区二区三区 | 午夜一级久久| 香蕉成人久久| 亚洲第一毛片| 久久精品欧美| 日韩视频欧美视频| 美国十次成人| 亚洲乱码一区二区| 伊人久久大香线蕉av超碰演员| 欧美亚洲成人精品| 久久精品主播| 欧美在线|欧美| 久久久欧美精品| 亚洲欧美日韩精品久久| 欧美99在线视频观看| 伊人天天综合| 久久精品视频免费| 亚洲福利在线视频| 亚洲一区在线看| 亚洲精品久久久久| 欧美在线亚洲| 正在播放日韩| 亚洲精品久久嫩草网站秘色| 亚洲国产日韩精品| 国产欧美日韩三区| 老**午夜毛片一区二区三区| 午夜亚洲福利| 亚洲精选大片| 亚洲精品久久久久久下一站| 影音先锋日韩有码| 国产精品欧美日韩一区| 国产精品久久久久久久久久免费| 欧美精品首页| 免费亚洲电影| 欧美国内亚洲| 久久一区二区三区四区| 久久久中精品2020中文| 亚洲国产视频直播| 亚洲级视频在线观看免费1级| 欧美电影免费观看| 美女视频黄免费的久久| 噜噜噜噜噜久久久久久91| 欧美伊人精品成人久久综合97| 亚洲在线视频| 亚洲日本va午夜在线影院| 日韩天堂av| 亚洲国产三级网| 一区二区三区欧美视频| 99视频一区二区| 久久亚洲不卡| 亚洲精品一区二区三区av| 欧美+亚洲+精品+三区| 欧美激情一区二区三区在线视频| 欧美高清自拍一区|