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

lzm

who dare win.
posts - 14, comments - 29, trackbacks - 0, articles - 0

Bellman_Ford算法 SPFA算法

Posted on 2009-04-09 19:16 lzmagic 閱讀(2305) 評論(1)  編輯 收藏 引用 所屬分類: Algorithm
/**
 * BELLMAN_FORD (簡單版) 單源最短路徑算法(允許存在負(fù)邊) 
 * 輸入:(1)有向圖g;
 *         (2)源點(diǎn)s。 
 * 輸出:(1)源點(diǎn)s到各點(diǎn)的最短路徑長dist; 
 *         (2)源點(diǎn)s到各點(diǎn)的最短路徑prev。
 * 結(jié)構(gòu): 圖g用鄰接表表示 
 * 算法:Bellman_Ford算法  
 * 復(fù)雜度:O(|E|*|V|) 
 
*/


#include 
<iostream>
#include 
<string>
#include 
<vector>
#include 
<deque>
#include 
<list>
#include 
<stack>
#include 
<queue>
#include 
<iterator>
#include 
<algorithm>
#include 
<numeric>
#include 
<functional>
#include 
<climits>
using namespace std;
 
struct Edge 

    
int v, w; 
    Edge(
int vertex, int weight): v(vertex), w(weight) { }
}
;

int n;                     // n : 頂點(diǎn)數(shù) 
vector<list<Edge> > g;     // g : 圖(graph)(用鄰接表(adjacent list)表示)
int s;                    // s : 源點(diǎn)(source) 
vector<int> dist;        // dist : 源點(diǎn)s到各點(diǎn)的最短路徑長 
vector<int> prev;        // prev : 各點(diǎn)最短路徑的前一頂點(diǎn)

bool Bellman_Ford()
{
    dist.assign(n, INT_MAX);
    prev.resize(n);        
// 初始化dist、prev。
    dist[s] = 0;        // 初始化源點(diǎn)s到自身的路徑長為0。
    for (int i = 0; i < n - 1++i)        // 迭代(n - 1)次。(因為無回路的路徑步數(shù)最多(n -1)次) 
        for (int u = 0; u < n; ++u)        
            
for (list<Edge>::iterator it = g[u].begin(); it != g[u].end(); ++it)// 遍歷每條邊, 
                if (dist[it->v] > dist[u] + it->w) // 如果dist[u] + weight[u][v] < dist[v], 
                {
                    dist[it
->v] = dist[u] + it->w;
                    prev[it
->v] = u;    // 調(diào)整各點(diǎn)的最短路徑長dist和最短路徑的前一頂點(diǎn) prev。  
                }

                
    
for (int u = 0; u < n; ++u)
        
for (list<Edge>::iterator it = g[u].begin(); it != g[u].end(); ++it) // 遍歷每條邊,
            if (dist[it->v] > dist[u] + it->w) // 如果dist[u] + weight[u][v] < dist[v], 
                return false;        // 說明存在負(fù)值回路,失敗; 
    return true;    // 否則成功。 
}


void Print_SP(int v)
{
     
if (v != s) Print_SP(prev[v]);
     cout 
<< v << " ";
}


int main()
{
    n 
= 5;
    g.assign(n, list
<Edge>());
    g[
0].push_back(Edge(1,  6)); g[0].push_back(Edge(37));
    g[
1].push_back(Edge(2,  5)); g[1].push_back(Edge(38)); g[1].push_back(Edge(4-4)); 
    g[
2].push_back(Edge(1-2));
    g[
3].push_back(Edge(2-3)); g[3].push_back(Edge(49));
    g[
4].push_back(Edge(0,  2)); g[4].push_back(Edge(27));
    
    
if (Bellman_Ford())
    
{
        copy(dist.begin(), dist.end(), ostream_iterator
<int>(cout, " ")); cout << endl;
        
for (int i = 0; i < n; ++i)
            
if (dist[i] != INT_MAX)
            
{
                cout 
<< s << "->" << i << "";
                Print_SP(i); 
                cout 
<< endl; 
            }

    }

    
else
    
{
        cout 
<< "Graph contains a negative-weight cycle" << endl;
    }

    
    system(
"pause");
    
return 0;
}


/**
 * SPFA (Shortest Path Faster Algorithm) 
 * BELLMAN_FORD (升級版) 單源最短路徑算法(允許存在負(fù)邊) 
 * 輸入:(1)有向圖g;
 *         (2)源點(diǎn)s。 
 * 輸出:(1)源點(diǎn)s到各點(diǎn)的最短路徑長dist; 
 *         (2)源點(diǎn)s到各點(diǎn)的最短路徑prev。
 * 結(jié)構(gòu): 圖g用鄰接表表示 
 * 算法:SPFA算法  
 * 復(fù)雜度:O(|E|*|V|) 
 
*/


#include 
<iostream>
#include 
<string>
#include 
<vector>
#include 
<deque>
#include 
<list>
#include 
<stack>
#include 
<queue>
#include 
<iterator>
#include 
<algorithm>
#include 
<numeric>
#include 
<functional>
#include 
<climits>
using namespace std;

struct Edge 

    
int v, w; 
    Edge(
int vertex, int weight): v(vertex), w(weight) { }
}
;

int n;                     // n : 頂點(diǎn)數(shù) 
vector<list<Edge> > g;     // g : 圖(graph)(用鄰接表(adjacent list)表示)
int s;                    // s : 源點(diǎn)(source) 
vector<int> dist;        // dist : 源點(diǎn)s到各點(diǎn)的最短路徑長 
vector<int> prev;        // prev : 各點(diǎn)最短路徑的前一頂點(diǎn)

bool SPFA()
{
    queue
<int> que;
    vector
<bool> pushed(n, false);
    dist.assign(n, INT_MAX);
    prev.resize(n);            
// 初始化pushed、dist、prev。
    dist[s] = 0; que.push(s); pushed[s] = true;    // 初始化源點(diǎn)s到自身的路徑長為0,入隊。 
    while (!que.empty())    // 如果隊列que非空,
    {
        
int u = que.front(); que.pop(); pushed[u] = false;    // 頂點(diǎn)u出隊, 
        for (list<Edge>::iterator it = g[u].begin(); it != g[u].end(); ++it) // 遍歷所有u指向的頂點(diǎn)v,
            if (dist[it->v] > dist[u] + it->w)    // 如果dist[u] + weight[u][v] < dist[v],
            {
                dist[it
->v] = dist[u] + it->w;
                prev[it
->v] = u;    // 調(diào)整各點(diǎn)的最短路徑長dist和最短路徑的前一頂點(diǎn) prev; 
                if (!pushed[it->v]) { que.push(it->v); pushed[it->v] = true; } // 如果頂點(diǎn)v不在隊列中,入隊。 
            }

    }

                
    
for (int u = 0; u < n; ++u)
        
for (list<Edge>::iterator it = g[u].begin(); it != g[u].end(); ++it) // 遍歷每條邊,
            if (dist[it->v] > dist[u] + it->w) // 如果dist[u] + weight[u][v] < dist[v], 
                return false;        // 說明存在負(fù)值回路,失敗; 
    return true;    // 否則成功。 
}


void Print_SP(int v)
{
     
if (v != s) Print_SP(prev[v]);
     cout 
<< v << " ";
}


int main()
{
    n 
= 5;
    g.assign(n, list
<Edge>());
    g[
0].push_back(Edge(1,  6)); g[0].push_back(Edge(37));
    g[
1].push_back(Edge(2,  5)); g[1].push_back(Edge(38)); g[1].push_back(Edge(4-4)); 
    g[
2].push_back(Edge(1-2));
    g[
3].push_back(Edge(2-3)); g[3].push_back(Edge(49));
    g[
4].push_back(Edge(0,  2)); g[4].push_back(Edge(27));
    
    
if (SPFA())
    
{
        copy(dist.begin(), dist.end(), ostream_iterator
<int>(cout, " ")); cout << endl;
        
for (int i = 0; i < n; ++i)
            
if (dist[i] != INT_MAX)
            
{
                cout 
<< s << "->" << i << "";
                Print_SP(i); 
                cout 
<< endl; 
            }

    }

    
else
    
{
        cout 
<< "Graph contains a negative-weight cycle" << endl;
    }

    
    system(
"pause");
    
return 0;
}

Feedback

# re: Bellman_Ford算法 SPFA算法  回復(fù)  更多評論   

2009-05-21 08:39 by dustman
其實(shí)你這個SPFA 寫錯了, 就是判斷不了負(fù)循環(huán) 不信你可以試下,他判斷負(fù)循環(huán)的方法跟BELLMAN不一樣

你只要開個數(shù)組 記錄每個頂點(diǎn)的入隊次數(shù), 如果哪個頂點(diǎn)入隊次數(shù)超過頂點(diǎn)個數(shù) 那么有負(fù)循環(huá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>
            美脚丝袜一区二区三区在线观看| 亚洲一区日韩| 欧美精品一区三区在线观看| 免费亚洲婷婷| 欧美日韩福利| 欧美体内she精视频| 国产精品久久久久aaaa樱花| 国产精品手机视频| 黄色一区二区三区| 亚洲片在线资源| 亚洲一二三区在线| 久久久777| 最近中文字幕日韩精品| 日韩视频一区二区在线观看| 亚洲无线视频| 美女日韩在线中文字幕| 欧美涩涩视频| 欲色影视综合吧| 亚洲影视九九影院在线观看| 久久精品一区四区| 91久久嫩草影院一区二区| 中文在线资源观看网站视频免费不卡| 欧美亚洲一区二区在线观看| 欧美成人免费大片| 国产伦理精品不卡| 麻豆视频一区二区| 国产精品99免费看| 在线观看日韩一区| 亚洲欧美成人精品| 亚洲国产91色在线| 欧美一区二区黄| 欧美日韩成人一区二区| 激情国产一区| 午夜日韩av| 日韩视频永久免费观看| 米奇777在线欧美播放| 国产女同一区二区| 在线亚洲欧美专区二区| 欧美激情第五页| 欧美一区日本一区韩国一区| 欧美日韩免费高清| 亚洲片在线观看| 蜜臀久久久99精品久久久久久| 亚洲视频中文| 欧美日韩精品在线观看| 亚洲激情av在线| 久久亚洲一区| 欧美一区二区三区四区高清| 国产精品美女视频网站| 亚洲午夜精品久久| 日韩亚洲国产欧美| 欧美日韩一级片在线观看| 亚洲精品一区二区网址| 欧美国产日韩在线| 欧美成人午夜免费视在线看片| 精品粉嫩aⅴ一区二区三区四区| 欧美一区二区在线| 欧美亚洲综合网| 国产一区二区按摩在线观看| 久久精品免费播放| 欧美一区视频在线| 激情av一区| 欧美大胆成人| 欧美成人四级电影| 夜夜嗨av一区二区三区网站四季av | 亚洲男女自偷自拍| 国产精品日本欧美一区二区三区| 亚洲小说区图片区| 中文在线资源观看网站视频免费不卡 | 亚洲自拍啪啪| 国产日韩成人精品| 久久深夜福利免费观看| 久久蜜桃av一区精品变态类天堂| 亚洲成在线观看| 亚洲国产精品毛片| 欧美日韩另类字幕中文| 亚洲午夜久久久| 亚洲在线黄色| 久久久久综合| 亚洲精品久久久久久下一站| 亚洲欧洲一区二区三区久久| 欧美色123| 久久精品在线播放| 欧美成人一区二区三区片免费| 一区二区三区你懂的| 亚洲影院高清在线| 一区视频在线看| 亚洲品质自拍| 国产亚洲欧美日韩一区二区| 欧美国产日韩在线观看| 欧美性大战久久久久| 久久精品亚洲精品| 蜜臀a∨国产成人精品| 亚洲专区国产精品| 久久久久这里只有精品| 在线一区观看| 老妇喷水一区二区三区| 亚洲欧美日韩在线不卡| 美女视频黄 久久| 欧美一级视频精品观看| 欧美成人综合一区| 久久蜜桃香蕉精品一区二区三区| 欧美激情中文字幕乱码免费| 久久精品国产亚洲aⅴ| 欧美精品一卡二卡| 麻豆成人在线观看| 国产精品一区一区三区| 亚洲国产高清自拍| 国产视频在线一区二区| 99re热这里只有精品免费视频| 国产综合久久久久久| 一区二区三区四区五区在线| 亚洲国产精品久久久久秋霞影院| 亚洲欧美精品中文字幕在线| 一本大道久久精品懂色aⅴ| 久久免费观看视频| 久久久www免费人成黑人精品| 欧美亚洲成人免费| 亚洲免费不卡| 日韩香蕉视频| 牛夜精品久久久久久久99黑人| 久久久久国产精品人| 国产精品你懂得| 夜夜嗨av一区二区三区四区| 亚洲免费观看视频| 欧美黄色一级视频| 亚洲高清不卡在线观看| 亚洲承认在线| 麻豆九一精品爱看视频在线观看免费| 久久精品国产综合精品| 国产日韩欧美综合一区| 亚洲欧美日韩国产成人精品影院| 一本一道久久综合狠狠老精东影业| 女同性一区二区三区人了人一 | 中文国产成人精品久久一| 免费的成人av| 亚洲第一中文字幕在线观看| 亚洲国产日韩在线一区模特| 久久久久久尹人网香蕉| 欧美va亚洲va国产综合| 亚洲国产精品综合| 欧美护士18xxxxhd| 欧美一区=区| 国产精品视频大全| 欧美一区不卡| 欧美高清视频一区二区三区在线观看| 影音先锋亚洲电影| 免费国产一区二区| 亚洲国产精品福利| 中文欧美在线视频| 国产精品一区二区久激情瑜伽| 午夜视频在线观看一区二区| 久久久久久亚洲精品中文字幕| 好吊一区二区三区| 欧美国产日韩一区二区| 夜夜嗨av色综合久久久综合网| 欧美一区二区视频观看视频| 伊人久久大香线| 欧美精品系列| 亚洲在线视频免费观看| 老司机精品久久| 99视频在线观看一区三区| 国产精品萝li| 久久中文字幕导航| 一区二区激情| 欧美成人一区二区| 亚洲亚洲精品在线观看| 国产一区二区三区直播精品电影| 免费观看成人www动漫视频| 一本色道久久综合| 美日韩精品免费观看视频| 一区二区三区高清不卡| 国产伊人精品| 欧美日韩午夜精品| 久久九九久精品国产免费直播| 亚洲精品视频啊美女在线直播| 欧美综合国产精品久久丁香| 亚洲精品一区久久久久久| 国产午夜精品一区二区三区欧美 | 欧美日韩在线播放一区二区| 午夜精品一区二区三区电影天堂| 亚洲成色777777在线观看影院| 午夜精品福利电影| 日韩视频一区| 在线不卡a资源高清| 国产精品日韩在线观看| 欧美韩日一区二区| 久久精品亚洲热| 亚洲一区成人| 亚洲免费精品| 欧美成人综合在线| 久久久久一区二区| 亚洲欧美在线aaa| 夜夜嗨av色一区二区不卡| 狠狠色丁香婷婷综合久久片| 国产精品r级在线| 欧美日韩dvd在线观看| 欧美成人精品在线| 你懂的网址国产 欧美| 开元免费观看欧美电视剧网站|