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

jake1036

圖算法-prim 與 Djkstra方法之間的區(qū)別

                       圖算法

一 PRIM算法與DIJKSTRA算法

    兩個算法之間都有相似性,都用到了堆結(jié)構(gòu),都是使用了貪心性質(zhì),所以容易混淆。

二 PRIM算法

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

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

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

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

             注意更新完之后需要對key[i]重新執(zhí)行siftup()操作,對堆進(jìn)行調(diào)整。
            重復(fù)執(zhí)行上述過程,知道堆Q為空。則結(jié)束執(zhí)行 

            整個算法的復(fù)雜度為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初始化函數(shù) 
 {
   
int i ;
   
for(i = 0 ; i < N ; i++)
   
{
        key[i] 
= 66536 ;
        par[i] 
= -1 ; //父節(jié)點 
        visit[i] = 0 ; //表示是否在Q中,在Q中則為1 
        
   }

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

 
 
 
//在Q堆中查找最小值  返回下標(biāo) 
 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 ;//做標(biāo)記   
     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] ;  //當(dāng)把一個新的節(jié)點加入樹中時,需要改變與其直接相鄰的節(jié)點 
              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 ; //無向圖 所以每個節(jié)點均賦值   
     matrix[c2-'a'][c1-'a'= w ;        
   }
  
  
int u = prim();
   
   
//print(u) ;   
   system("pause") ;  
   
return 0 ;    
 }

 

三  Dijkstra算法 
 

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

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

 
     代碼如下:
    

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

*/
 

#include 
<iostream>
 
using namespace std ;
 
struct Node  //使用鄰接表存儲圖 
 {
   
int col ; //下一個節(jié)點 
   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 ;  //標(biāo)記堆中的元素個數(shù) 
 
 
//將元素插入堆中 
 void siftup(int u)
 
{
    
      
    heap[
++top] = u ; //將該元素插入進(jìn)堆中的最后一個位置
                         
//然后向上移動,直到到達(dá)頂部  
    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--] ; //將最末的一個節(jié)點移到堆的頭部 
    
//然后執(zhí)行下移操作
    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 ; //對源點進(jìn)行初始化 
   
   
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++ ) //創(chuàng)建每一個鄰接表的節(jié)點 
  {
    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)  編輯 收藏 引用 所屬分類: 算法相關(guān)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美77777| 欧美国产日本韩| 久久这里有精品视频| 亚洲欧美日韩在线不卡| 亚洲图片在线观看| 日韩视频免费在线| 欧美日韩国产专区| 欧美日韩中文字幕精品| 欧美人妖在线观看| 欧美特黄一区| 国产午夜精品视频免费不卡69堂| 国产日韩欧美91| 在线日韩av片| 99精品国产福利在线观看免费| 日韩午夜在线视频| 欧美一区二区成人6969| 久久精品国产99| 欧美成人精品一区二区| 亚洲黄一区二区| 亚洲人成久久| 亚洲天堂成人在线观看| 久久精品国产欧美亚洲人人爽| 久久久久久久999精品视频| 欧美精品一区二区精品网| 国产精品美女久久久久久2018 | 午夜精品福利视频| 久久精品理论片| 91久久中文| 午夜一区二区三视频在线观看 | 欧美成熟视频| 亚洲一二三区视频在线观看| 久久精品视频在线看| 欧美精品色网| 国产亚洲人成a一在线v站| 91久久精品一区| 欧美在线三区| 最新日韩av| 久久尤物电影视频在线观看| 亚洲美女在线看| 久久久久青草大香线综合精品| 欧美午夜精品理论片a级按摩 | 国产精品日韩久久久| 伊人久久综合| 欧美一区二区三区四区在线| 亚洲欧洲日夜超级视频| 久久精品亚洲热| 国产一区二区三区四区三区四| 亚洲免费激情| 亚洲激情在线| 美腿丝袜亚洲色图| 国产自产高清不卡| 欧美综合第一页| 一本一本久久a久久精品综合妖精| 蜜臀久久99精品久久久画质超高清| 国产免费成人av| 香蕉精品999视频一区二区| 欧美大片在线观看一区| 欧美亚州一区二区三区| 亚洲美女区一区| 欧美α欧美αv大片| 久久久精品一区二区三区| 国产日韩精品一区二区三区在线 | 国内精品亚洲| 开心色5月久久精品| 亚洲欧美中文另类| 国产精品入口夜色视频大尺度| 亚洲夜晚福利在线观看| 亚洲精品久久久蜜桃| 欧美日韩成人网| 亚洲一级在线| 亚洲深夜福利视频| 国产精品影院在线观看| 久久爱91午夜羞羞| 欧美影院在线| 亚洲大黄网站| 亚洲电影在线| 欧美日韩精品一本二本三本| 亚洲视频欧美视频| 亚洲一区精彩视频| 国产欧美日韩精品一区| 久久亚洲私人国产精品va媚药| 久久中文字幕一区二区三区| 亚洲区国产区| 亚洲一级特黄| 国产情人节一区| 老司机精品视频一区二区三区| 六月婷婷一区| 亚洲天堂久久| 久久精品午夜| aa级大片欧美| 久久中文字幕导航| 欧美r片在线| 亚洲欧美国产一区二区三区| 久久黄色小说| 在线视频你懂得一区| 亚洲国产成人精品久久久国产成人一区| 欧美激情国产高清| 欧美在线黄色| 欧美精品亚洲二区| 久久久在线视频| 欧美激情精品久久久久久变态| 亚洲你懂的在线视频| 久久久久久久久久看片| 亚洲免费伊人电影在线观看av| 久久av红桃一区二区小说| 99视频在线精品国自产拍免费观看| 亚洲影院色无极综合| 亚洲国产另类久久精品| 亚洲欧美日韩电影| 亚洲美女网站| 久久久蜜桃精品| 亚洲欧美日韩国产一区二区| 久久精品在线免费观看| 亚洲天堂av在线免费| 美女在线一区二区| 六月婷婷一区| 国产香蕉久久精品综合网| 老司机久久99久久精品播放免费 | 久久一本综合频道| 欧美日韩一区二区在线视频| 在线免费观看日韩欧美| 亚洲在线日韩| 中文国产成人精品| 欧美精品videossex性护士| 久久这里有精品15一区二区三区| 国产女主播一区二区三区| 99日韩精品| 一级成人国产| 欧美精品免费播放| 亚洲第一狼人社区| 在线观看三级视频欧美| 亚洲免费婷婷| 亚洲欧美日韩综合aⅴ视频| 欧美日韩少妇| 亚洲免费观看| 亚洲国产精品久久久久秋霞不卡 | 久久午夜精品一区二区| 国产亚洲欧美日韩在线一区| 亚洲欧美日韩电影| 久久精品亚洲国产奇米99| 国产精品午夜在线| 亚洲视频综合| 欧美一区二区在线免费播放| 国产精品swag| 亚洲欧美一区二区三区久久| 欧美亚洲综合网| 国产亚洲精品美女| 久久免费视频在线观看| 久久全球大尺度高清视频| 伊人久久大香线| 浪潮色综合久久天堂| 亚洲成在人线av| 99精品热视频| 国产精品日韩精品| 久久噜噜噜精品国产亚洲综合| 欧美99久久| 9久草视频在线视频精品| 国产免费成人av| 久久在线免费观看| 日韩亚洲欧美综合| 欧美一区二区三区免费观看视频| 免费不卡中文字幕视频| 一本一本a久久| 久久久久成人精品免费播放动漫| 亚洲国产专区| 国产精品国产三级国产专区53 | 欧美日韩专区在线| 亚洲欧美在线观看| 欧美激情一区二区三级高清视频| 99re热这里只有精品免费视频| 欧美午夜久久久| 久久国产手机看片| 亚洲日本欧美在线| 久久久久成人精品| 日韩视频一区二区| 国产欧美一区二区三区在线老狼| 久久久精品网| 一本一本久久| 亚洲激情二区| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲巨乳在线| 久久激情视频久久| 亚洲精品影视在线观看| 免费成人毛片| 羞羞答答国产精品www一本| 欧美成人免费全部观看天天性色| 亚洲一二三区精品| 在线看欧美视频| 国产伦精品一区二区三| 你懂的网址国产 欧美| 亚洲午夜精品一区二区| 亚洲第一色在线| 久久久久欧美精品| 午夜精彩视频在线观看不卡 | 国产欧美日韩视频| 欧美经典一区二区三区| 久久国内精品视频| 午夜精彩国产免费不卡不顿大片| 亚洲国产欧美一区| 欧美14一18处毛片|