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

posts - 12,  comments - 16,  trackbacks - 0
 

Bellman-Ford算法與另一個(gè)非常著名的Dijkstra算法一樣,用于求解單源點(diǎn)最短路徑問(wèn)題。Bellman-ford算法除了可求解邊權(quán)均非負(fù)的問(wèn)題外,還可以解決存在負(fù)權(quán)邊的問(wèn)題(意義是什么,好好思考),而Dijkstra算法只能處理邊權(quán)非負(fù)的問(wèn)題,因此 Bellman-Ford算法的適用面要廣泛一些。但是,原始的Bellman-Ford算法時(shí)間復(fù)雜度為 OVE,Dijkstra算法的時(shí)間復(fù)雜度高,所以常常被眾多的大學(xué)算法教科書(shū)所忽略,就連經(jīng)典的《算法導(dǎo)論》也只介紹了基本的Bellman-Ford算法,在國(guó)內(nèi)常見(jiàn)的基本信息學(xué)奧賽教材中也均未提及,因此該算法的知名度與被掌握度都不如Dijkstra算法。事實(shí)上,有多種形式的Bellman-Ford算法的優(yōu)化實(shí)現(xiàn)。這些優(yōu)化實(shí)現(xiàn)在時(shí)間效率上得到相當(dāng)提升,例如近一兩年被熱捧的SPFAShortest-Path Faster Algoithm 更快的最短路徑算法)算法的時(shí)間效率甚至由于Dijkstra算法,因此成為信息學(xué)奧賽選手經(jīng)常討論的話題。然而,限于資料匱乏,有關(guān)Bellman-Ford算法的諸多問(wèn)題常常困擾奧賽選手。如:該算法值得掌握么?怎樣用編程語(yǔ)言具體實(shí)現(xiàn)?有哪些優(yōu)化?與SPFA算法有關(guān)系么?本文試圖對(duì)Bellman-Ford算法做一個(gè)比較全面的介紹。給出幾種實(shí)現(xiàn)程序,從理論和實(shí)測(cè)兩方面分析他們的時(shí)間復(fù)雜度,供大家在備戰(zhàn)省選和后續(xù)的noi時(shí)參考。

Bellman-Ford算法思想

Bellman-Ford算法能在更普遍的情況下(存在負(fù)權(quán)邊)解決單源點(diǎn)最短路徑問(wèn)題。對(duì)于給定的帶權(quán)(有向或無(wú)向)圖 G=V,E),其源點(diǎn)為s,加權(quán)函數(shù) w 邊集 E 的映射。對(duì)圖G運(yùn)行Bellman-Ford算法的結(jié)果是一個(gè)布爾值,表明圖中是否存在著一個(gè)從源點(diǎn)s可達(dá)的負(fù)權(quán)回路。若不存在這樣的回路,算法將給出從源點(diǎn)s G的任意頂點(diǎn)v的最短路徑d[v]。

Bellman-Ford算法流程分為三個(gè)階段:

1    初始化:將除源點(diǎn)外的所有頂點(diǎn)的最短距離估計(jì)值 d[v] +∞, d[s] 0;

2    迭代求解:反復(fù)對(duì)邊集E中的每條邊進(jìn)行松弛操作,使得頂點(diǎn)集V中的每個(gè)頂點(diǎn)v的最短距離估計(jì)值逐步逼近其最短距離;(運(yùn)行|v|-1次)

3    檢驗(yàn)負(fù)權(quán)回路:判斷邊集E中的每一條邊的兩個(gè)端點(diǎn)是否收斂。如果存在未收斂的頂點(diǎn),則算法返回false,表明問(wèn)題無(wú)解;否則算法返回true,并且從源點(diǎn)可達(dá)的頂點(diǎn)v的最短距離保存在 d[v]中。

算法描述如下:

 1 G:圖G
 2 E(G):邊的集合
 3 S: 源頂點(diǎn)
 4 Dis[i]:表示s到i的最短距離,初始為+
 5 D[s]=0;
 6 for (int i=0;i<|v|-1;i++)
 7  for each (u,v)∈E(G)
 8    if(dis[u]+w(u,v)<dis[v]
 9        dis[v]=dis[u]+w(u,v);
10 for each (u,v)∈E(G)
11  if(d[v]>d[u]+w(u,v)
12    return false;//返回false,說(shuō)明存在負(fù)權(quán)回路
13 return true;
14 
   

下面給出描述性證明:

   首先指出,圖的任意一條最短路徑既不能包含負(fù)權(quán)回路,也不會(huì)包含正權(quán)回路,因此它最多包含|v|-1條邊。

   其次,從源點(diǎn)s可達(dá)的所有頂點(diǎn)如果 存在最短路徑,則這些最短路徑構(gòu)成一個(gè)以s為根的最短路徑樹(shù)。Bellman-Ford算法的迭代松弛操作,實(shí)際上就是按頂點(diǎn)距離s的層次,逐層生成這棵最短路徑樹(shù)的過(guò)程。

在對(duì)每條邊進(jìn)行1遍松弛的時(shí)候,生成了從s出發(fā),層次至多為1的那些樹(shù)枝。也就是說(shuō),找到了與s至多有1條邊相聯(lián)的那些頂點(diǎn)的最短路徑;對(duì)每條邊進(jìn)行第2遍松弛的時(shí)候,生成了第2層次的樹(shù)枝,就是說(shuō)找到了經(jīng)過(guò)2條邊相連的那些頂點(diǎn)的最短路徑……。因?yàn)樽疃搪窂阶疃嘀话?/span>|v|-1 條邊,所以,只需要循環(huán)|v|-1 次。

每實(shí)施一次松弛操作,最短路徑樹(shù)上就會(huì)有一層頂點(diǎn)達(dá)到其最短距離,此后這層頂點(diǎn)的最短距離值就會(huì)一直保持不變,不再受后續(xù)松弛操作的影響。(但是,每次還要判斷松弛,這里浪費(fèi)了大量的時(shí)間,怎么優(yōu)化?單純的優(yōu)化是否可行?)

如果沒(méi)有負(fù)權(quán)回路,由于最短路徑樹(shù)的高度最多只能是|v|-1,所以最多經(jīng)過(guò)|v|-1遍松弛操作后,所有從s可達(dá)的頂點(diǎn)必將求出最短距離。如果 d[v]仍保持 +∞,則表明從sv不可達(dá)。

如果有負(fù)權(quán)回路,那么第 |v|-1 遍松弛操作仍然會(huì)成功,這時(shí),負(fù)權(quán)回路上的頂點(diǎn)不會(huì)收斂。

  

Bellman-Ford的隊(duì)列實(shí)現(xiàn)SPFA

 算法大致流程是用一個(gè)隊(duì)列來(lái)進(jìn)行維護(hù)。初始時(shí)將源加入隊(duì)列。每次從隊(duì)列中取出一個(gè)元素,并對(duì)所有與他相鄰的點(diǎn)進(jìn)行松弛,若某個(gè)相鄰的點(diǎn)松弛成功,則將其入隊(duì)。直到隊(duì)列為空時(shí)算法結(jié)束。

這個(gè)算法,簡(jiǎn)單的說(shuō)就是隊(duì)列優(yōu)化的bellman-ford,利用了每個(gè)點(diǎn)不會(huì)更新次數(shù)太多的特點(diǎn)發(fā)明的此算法

SPFA——Shortest Path Faster Algorithm,它可以在O(kE)的時(shí)間復(fù)雜度內(nèi)求出源點(diǎn)到其他所有點(diǎn)的最短路徑,可以處理負(fù)邊。SPFA的實(shí)現(xiàn)甚至比Dijkstra或者Bellman_Ford還要簡(jiǎn)單:

設(shè)Dist代表SI點(diǎn)的當(dāng)前最短距離,Fa代表SI的當(dāng)前最短路徑中I點(diǎn)之前的一個(gè)點(diǎn)的編號(hào)。開(kāi)始時(shí)Dist全部為+∞,只有Dist[S]=0,Fa全部為0。

維護(hù)一個(gè)隊(duì)列,里面存放所有需要進(jìn)行迭代的點(diǎn)。初始時(shí)隊(duì)列中只有一個(gè)點(diǎn)S。用一個(gè)布爾數(shù)組記錄每個(gè)點(diǎn)是否處在隊(duì)列中。

每次迭代,取出隊(duì)頭的點(diǎn)v,依次枚舉從v出發(fā)的邊v->u,設(shè)邊的長(zhǎng)度為len,判斷Dist[v]+len是否小于Dist[u],若小于則改進(jìn)Dist[u],將Fa[u]記為v,并且由于Su的最短距離變小了,有可能u可以改進(jìn)其它的點(diǎn),所以若u不在隊(duì)列中,就將它放入隊(duì)尾。這樣一直迭代下去直到隊(duì)列變空,也就是S到所有的最短距離都確定下來(lái),結(jié)束算法。若一個(gè)點(diǎn)入隊(duì)次數(shù)超過(guò)n,則有負(fù)權(quán)環(huán)。

SPFA 在形式上和寬度優(yōu)先搜索非常類似,不同的是寬度優(yōu)先搜索中一個(gè)點(diǎn)出了隊(duì)列就不可能重新進(jìn)入隊(duì)列,但是SPFA中一個(gè)點(diǎn)可能在出隊(duì)列之后再次被放入隊(duì)列,也就是一個(gè)點(diǎn)改進(jìn)過(guò)其它的點(diǎn)之后,過(guò)了一段時(shí)間可能本身被改進(jìn),于是再次用來(lái)改進(jìn)其它的點(diǎn),這樣反復(fù)迭代下去。設(shè)一個(gè)點(diǎn)用來(lái)作為迭代點(diǎn)對(duì)其它點(diǎn)進(jìn)行改進(jìn)的平均次數(shù)為k,有辦法證明對(duì)于通常的情況,k2左右

 1 圖G
 2 隊(duì)列 queue<int> q;
 3 Inque[i] 標(biāo)記i是否在隊(duì)列里,初始所有為false
 4 S: 源頂點(diǎn)
 5 Dis[i]:表示s到i的最短距離,初始為+
 6 
 7 Dis[s]=0;
 8 q.push(s);
 9 inque[s]=true;
10 while(q.size()>0)
11 {
12     Int t=q.front();
13 q.pop();
14 inque[t]=false;
15 for t’s adjacent vertex v
16  if(dis[t]+w(t,v)<dis[v])
17 {
18     Dis[v]=dis[t]+w(t,v);
19    If(!inque[v])
20    {
21         q.push(v);
22        inque[v]=true;
23     } 
24 }
25 
26 }
27 

   USACO 3.2 Sweet Butter
  

Sweet Butter

Greg Galperin -- 2001

Farmer John has discovered the secret to making the sweetest butter in all of Wisconsin: sugar. By placing a sugar cube out in the pastures, he knows the N (1 <= N <= 500) cows will lick it and thus will produce super-sweet butter which can be marketed at better prices. Of course, he spends the extra money on luxuries for the cows.

FJ is a sly farmer. Like Pavlov of old, he knows he can train the cows to go to a certain pasture when they hear a bell. He intends to put the sugar there and then ring the bell in the middle of the afternoon so that the evening's milking produces perfect milk.

FJ knows each cow spends her time in a given pasture (not necessarily alone). Given the pasture location of the cows and a description of the paths the connect the pastures, find the pasture in which to place the sugar cube so that the total distance walked by the cows when FJ rings the bell is minimized. FJ knows the fields are connected well enough that some solution is always possible.

PROGRAM NAME: butter

INPUT FORMAT

  • Line 1: Three space-separated integers: N, the number of pastures: P (2 <= P <= 800), and the number of connecting paths: C (1 <= C <= 1,450). Cows are uniquely numbered 1..N. Pastures are uniquely numbered 1..P.
  • Lines 2..N+1: Each line contains a single integer that is the pasture number in which a cow is grazing. Cow i's pasture is listed on line i+1.
  • Lines N+2..N+C+1: Each line contains three space-separated integers that describe a single path that connects a pair of pastures and its length. Paths may be traversed in either direction. No pair of pastures is directly connected by more than one path. The first two integers are in the range 1..P; the third integer is in the range (1..225).

SAMPLE INPUT (file butter.in)

3 4 5
2
3
4
1 2 1
1 3 5
2 3 7
2 4 3
3 4 5

INPUT DETAILS

This diagram shows the connections geometrically:

OUTPUT FORMAT

  • Line 1: A single integer that is the minimum distance the cows must walk to a pasture with a sugar cube.

SAMPLE OUTPUT (file butter.out)

8
OUTPUT DETAILS:
Putting the cube in pasture 4 means: cow 1 walks 3 units; cow 2 walks 5
units; cow 3 walks 0 units -- a total of 8.
解答:
   這道題直接用一般的Dijkstra算法O(P2),一共調(diào)用P次Dijkstra,總體復(fù)雜度O(P3),p=800,肯定超時(shí),在這里用SPFA算法,O(k*c),k是2左右的常數(shù),
調(diào)用p次,整體復(fù)雜度O(p*c*k).在0.2秒可以得出解.附原碼
/*
ID: kuramaw1
PROG: butter
LANG: C++
*/

#include 
<fstream>
#include 
<queue>

using std::ifstream;
using std::ofstream;
using std::queue;
using std::endl;
using std::vector;


#define  MAX_EDGE 1451
#ifndef INT_MAX 
#define  INT_MAX 2147483647
#endif

struct graph
{
    
struct Edge
    {
        
short n; // next adjacent edge
        short v; // to which vertex
        short c; // weight
        Edge(const short _n=-1,const short _v=-1,const short _c=0):n(-n),v(_v),c(-c)
        {

        }
        Edge(
const Edge &e):n(e.n),v(e.v),c(e.c)
        {

        }
        Edge 
& operator =(const Edge &e)
        {
            n
=e.n;
            v
=e.v;
            c
=e.c;
            
return *this;

        }
    };
    
struct Ver
    {
        
short w;
        
short e;//frist e
        Ver(const short _w=0,const short _e=-1):w(_w),e(_e)
        {

        }
        Ver(
const Ver &v):w(v.w),e(v.e)
        {

        }
        Ver 
& operator =(const Ver &v)
        {
            w
=v.w;
            e
=v.e;
            
return *this;
        }
    };
    typedef std::vector
<Edge> EdgeSet;
    typedef std::vector
<Ver> VertSet;
    
    VertSet _V;
    EdgeSet _E;

    
// interfaces
    inline void Reset(const short &n)
    {
        _V.resize(n);
        _E.clear();
        _E.reserve(MAX_EDGE);
    }
    inline 
void IncVetWei(const short &i)
    {
        _V[i].w
++;
    }
    inline 
void InsertEdge(short u, short v, short c)
    {
        Edge e;
        e.v 
= v, e.c = c, e.n = _V[u].e;
        _V[u].e 
= _E.size();
        _E.push_back(e);

        e.v 
= u, e.c = c, e.n = _V[v].e;
        _V[v].e 
= _E.size();
        _E.push_back(e);
    }
    
int short_dis_sum(const short &s)
    {
        vector
<int> dis;
        queue
<short> q;
        vector
<bool> b_in_que;
        dis.resize(_V.size(),INT_MAX);
        b_in_que.resize(_V.size(),
false);

        q.push(s);
        dis[s]
=0;
        b_in_que[s]
=true;
        
while(q.size()>0)
        {
            
short t=q.front();
            q.pop();
            b_in_que[t]
=false;
            
            
short e=_V[t].e;
            
while(e!=-1)
            {
                Edge 
&edge=_E[e];
                
if(dis[t]+edge.c<dis[edge.v])
                {
                    dis[edge.v]
=dis[t]+edge.c;
                    
if(!b_in_que[edge.v])
                    {
                        q.push(edge.v);
                        b_in_que[edge.v]
=true;
                    }
                }
                e
=edge.n;
            }
        }

        
int sum(0);
        
for(short i=0;i<dis.size();i++)
         
if(_V[i].w>0)
         {
             sum
+=_V[i].w*dis[i];
         }
       
return sum;
    }

};

graph g;

short n,p,c;

int main()
{
   ifstream 
in("butter.in");
   
in>>n>>p>>c;
   
   g.Reset(p);
   
for(short i=0;i<n;i++)
   {
       
short v;
       
in>>v;
       g.IncVetWei(v
-1);
   }
   
for(short i=0;i<c;i++)
   {
       
short u,v,w;
       
in>>u>>v>>w;
       g.InsertEdge(u
-1,v-1,w);
   }

   
in.close();

   
int min_dis=INT_MAX;

   
for(int i=0;i<p;i++)
   {
       
int dis=g.short_dis_sum(i);
       
if(dis<min_dis)
           min_dis
=dis;
   }

   
//out
   ofstream out("butter.out");
   
out<<min_dis<<endl;
   
out.close();

}
 
 
 

 

posted on 2009-08-12 21:49 kuramawzw 閱讀(1054) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 圖論
<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(5)

隨筆分類

隨筆檔案

文章檔案

Algorithm

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费观看在线综合| 韩国欧美一区| 欧美亚洲免费在线| 在线午夜精品| 一区二区av| 99精品视频一区| 亚洲美女视频在线免费观看| 亚洲国产精品123| 美女露胸一区二区三区| 欧美成人一品| 亚洲丶国产丶欧美一区二区三区| 久久综合伊人77777蜜臀| 久久综合福利| 亚洲国产另类久久精品| 亚洲精品偷拍| 亚洲一区二区三区精品视频| 一区二区三区回区在观看免费视频| 亚洲靠逼com| 亚洲婷婷免费| 久久久久久久久久久成人| 老司机67194精品线观看| 欧美成人精品在线观看| 亚洲视屏一区| 久久久久久久综合狠狠综合| 你懂的网址国产 欧美| 亚洲精华国产欧美| 亚洲一区久久久| 久久久久久有精品国产| 欧美国产视频日韩| 国产综合网站| 在线一区亚洲| 麻豆精品网站| 亚洲亚洲精品在线观看| 久久婷婷麻豆| 国产精品久久久久久影视 | 亚洲欧美日韩久久精品 | 欧美+日本+国产+在线a∨观看| 久久综合成人精品亚洲另类欧美| 欧美国产综合视频| 亚洲欧美激情视频| 欧美精品日韩www.p站| 国产欧美日韩专区发布| 亚洲精品字幕| 欧美~级网站不卡| 亚洲女人av| 欧美日本中文| 亚洲国产精品久久久久秋霞不卡| 午夜精品亚洲一区二区三区嫩草| 欧美成人免费网| 性色av一区二区三区红粉影视| 欧美日本韩国一区| 亚洲国产mv| 久久天天躁狠狠躁夜夜爽蜜月| 一区二区欧美在线观看| 免费短视频成人日韩| 国产一区二区三区在线观看网站 | 亚洲国产你懂的| 久久久夜精品| 性欧美暴力猛交69hd| 国产精品日韩一区二区三区| 一本色道久久综合亚洲精品不卡| 欧美电影在线观看完整版| 欧美在线视频在线播放完整版免费观看 | 激情校园亚洲| 久久久999| 欧美一二三视频| 国产欧美一区二区精品性| 亚洲欧美另类国产| 亚洲深爱激情| 国产精品视频福利| 欧美亚洲视频在线观看| 一区二区三区四区蜜桃| 欧美视频观看一区| 亚洲一区二区视频| 亚洲午夜精品久久久久久浪潮| 国产精品白丝jk黑袜喷水| 亚洲视频狠狠| 亚洲午夜在线观看| 国产一区二区久久精品| 久久久水蜜桃av免费网站| 久久国产黑丝| 亚洲国产精品尤物yw在线观看| 欧美国产三级| 欧美啪啪一区| 先锋影音网一区二区| 亚洲免费av片| 99ri日韩精品视频| 99视频精品| 欧美精品乱人伦久久久久久| 美女亚洲精品| 亚洲精品在线一区二区| 欧美成人午夜激情| 午夜精品久久久久久久| 国产欧美韩国高清| 久久国产日本精品| 亚洲日本欧美在线| 亚洲尤物在线| 伊人一区二区三区久久精品| 久久久精彩视频| 亚洲精品1区| 久久国产99| 亚洲美女尤物影院| 国产色视频一区| 欧美激情综合五月色丁香小说| 一本久道久久综合中文字幕| 久久av二区| 亚洲日本一区二区| 国内精品国产成人| 国产精品高潮呻吟久久| 免费黄网站欧美| 久久国产色av| 久久久在线视频| 久久精品av麻豆的观看方式| 一区二区三区欧美日韩| 亚洲三级电影在线观看| 久久伊人一区二区| 欧美亚洲专区| 久久久xxx| 另类av一区二区| 久久亚洲视频| 欧美成人tv| 欧美成年人网站| 国产精品一区二区你懂的| 久久久久久久久久码影片| 亚洲精品日韩综合观看成人91| 亚洲国语精品自产拍在线观看| 国产精品第一页第二页第三页| 久久久一二三| 久久嫩草精品久久久精品| 一卡二卡3卡四卡高清精品视频| 国产在线欧美| 国内欧美视频一区二区| 国产亚洲精品美女| 国产精品一区亚洲| 国内精品久久久久久影视8| 国产精品欧美久久| 国产精品高潮视频| 欧美精品色网| 欧美日一区二区在线观看 | 欧美日韩国产成人在线观看| 欧美淫片网站| 久久天堂成人| 亚洲精品视频在线看| 欧美高清视频一二三区| 亚洲日本视频| 亚洲无玛一区| 噜噜噜久久亚洲精品国产品小说| 噜噜噜91成人网| 国产精品免费一区二区三区在线观看 | 亚洲激情在线| 亚洲小说区图片区| 六十路精品视频| 99ri日韩精品视频| 久久精品人人爽| 欧美日韩国产成人在线| 一级日韩一区在线观看| 午夜精彩视频在线观看不卡 | 亚洲日本欧美天堂| 免费久久久一本精品久久区| 99热精品在线观看| 欧美激情国产日韩精品一区18| 国产精品久久久久久久久久久久久久 | 悠悠资源网亚洲青| 亚洲夜晚福利在线观看| 麻豆精品在线播放| 欧美在线一区二区| 国产精品综合av一区二区国产馆| 亚洲精品国产精品久久清纯直播 | 亚洲欧洲综合另类在线| 久久久久久香蕉网| 亚洲第一精品电影| 欧美顶级少妇做爰| 免费在线播放第一区高清av| 国产偷国产偷精品高清尤物| 亚洲一级特黄| 亚洲欧美成人一区二区在线电影 | 夜夜嗨av一区二区三区四区| 久久婷婷影院| 亚洲区中文字幕| 国产精品v欧美精品∨日韩| 一本久久综合| 亚洲欧美日韩在线一区| 国产一区二区三区在线观看精品| 亚洲午夜精品一区二区三区他趣| 久久精品一区二区三区不卡牛牛 | 老司机一区二区三区| 亚洲国产成人久久综合一区| 亚洲高清自拍| 国产精品一二三四区| 麻豆成人在线观看| 国产精品久久国产三级国电话系列 | 午夜久久久久久久久久一区二区| 国产亚洲一区精品| 亚洲精品自在久久| 国内成人精品一区| 一本色道综合亚洲| 亚洲精品欧洲精品| 午夜精品亚洲| 午夜老司机精品| 欧美日韩视频一区二区三区|