Bellman Ford演算法模板題

2022-06-01 01:36:16 字數 3070 閱讀 2648

poj 3259 蟲洞(bellman-ford判斷有無負環的問題)

描述:在探索他的許多農場時,farmer john發現了許多令人驚嘆的蟲洞。

蟲洞是非常奇特的,因為它是一條單向路徑,在您進入蟲洞之前的某個時間將您帶到目的地!

每個fj的農場包括

ñ(1≤ 

ñ≤500)字段方便地編號為1 .. ñ,

中號(1≤ 

中號≤2500)的路徑,和

w ^(1≤ 

w ^≤200)蟲洞。

由於fj是狂熱的時間旅行愛好者,他想要做以下事情:從一些場地開始,穿過一些路徑和蟲洞,並在他最初離開前的一段時間返回起跑場。

也許他將能夠見到自己:)。

為了幫助fj找出這是否可行與否,他將與完整的地圖供你

˚f(1≤ 

˚f他的農場≤5)。

沒有路徑需要超過10,000秒的旅行時間,沒有蟲洞可以使fj及時返回超過10,000秒。

輸入:第1行:單個整數,f。

f農場描述如下。 

每個農場的第1行:分別為三個以空格分隔的整數:n,

m和w第2行。

每個農場的

m+ 1:三個以空格分隔的數字(s,

e,t)分別描述:雙向路徑在s和

e之間需要t

秒來遍歷。

兩個字段可能通過多個路徑連線。 線中號

2 .. 

中號+ 

w ^每個場的1:三個空間分隔的數字(s,

e,t)分別描述:從s到

e的單向路徑

,也將旅行者移回t秒。

輸出:第1行...... 

f:對於每個農場,如果fj可以達到目標,則輸出「yes」,否則輸出「no」(不包括引號)。

//

這是一道判斷有無負環的題目,主要是為了熟悉bellman-ford演算法,寫法也是採用模板題的寫法

#include #include

#include

#include

using

namespace

std;

intf,n,m,w,all_e;

int dis[505

];struct

node edge[

6000

];bool

bellman_ford()

if(!flag)

break

;

}for(int j=0; j)

if(dis[edge[j].e] > dis[edge[j].s] +edge[j].t)

return

true

;

return

false;}

intmain ()

for(int i=0; i)

if(bellman_ford())

cout

<<"

yes"

cout

<<"no"

<}

return0;

}

poj 1860 兌換貨幣(判斷有無正環)

描述我們城市有幾個貨幣兌換點在運作。假設每個點專門處理兩種特定的貨幣,並且只對這些貨幣執行兌換操作。可以有幾個點專門針對同一種貨幣。每個點都有自己的匯率,a到b的匯率是1a的b的數量。另外,每個兌換點都有一定的佣金,你必須為你的兌換業務支付的金額。佣金總是以貨幣量收取。

例如,如果你想在兌換點將100美元兌換成俄羅斯盧布,匯率為29.75,佣金為0.39,你將得到(100-0.39)*29.75=2963.3975rur。

你當然知道,在我們的城市裡,你可以對付n種不同的貨幣。讓我們為每種貨幣分配從1到n的唯一整數。然後,每個交換點可以用6個數字來描述:整數a和b-它交換的貨幣數和實r。ab型、cab型,r巴和c巴-交換a至b和b至a時的匯率和佣金。

尼克有一些貨幣s,他想知道他是否可以某種方式,在一些外匯操作後,增加他的資本。當然,他最終想把錢換成s貨幣。幫助他回答這個難題。尼克在做手術的時候總要有一筆非負的錢。

輸入輸入的第一行包含四個數字:n-貨幣數量,m-外匯點數,s-貨幣尼克的數量,v-他擁有的貨幣單位的數量。以下m行按上述順序分別包含6個數字-對應的交換點的描述。數字由乙個或多個空格分隔。1<=s<=n<=100,1<=m<=100,v為實數,0<=v<=103. 

每一點的匯率和佣金是真實的,小數點之後最多有兩位數,即10。-2

<=rate<=102,0<=佣金<=102. 

如果在這個序列中沒有不止一次使用交換點,那麼讓我們簡單地呼叫交換操作的某些序列。您可以假設,在任何簡單的交換操作序列的末尾和開始處的數字值的比率將小於10。4. 

輸出量如果尼克能增加他的財富,產出是肯定的,在其他情況下輸出不輸出檔案。

樣本輸入

3 2 1 20.0

1 2 1.00 1.00 1.00 1.00

2 3 1.10 1.00 1.10 1.00

樣本輸出

yes

//

該題剛剛寫的時候,不知道怎麼處理這些資料,把這些資料看成圖,其實本質都是一樣的,只不給邊賦予了性質,處理好這些資料又是一道模板題

#include #include

using

namespace

std;

int g1[105][105]=,g2[105][105]=;

double dis[105]=;

intn,m,s;

double

v;struct

nodeedge[

105];

bool

bellman_ford()

}if(!flag)

break

; }

for(int j=0; j<2*m; j++)

}return

false;}

intmain()

if(bellman_ford())

cout

<<"

yes"

cout

<<"no"

}

Bellman Ford演算法 模板

如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入格式 第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。輸出格式 一行,包含n個用空格分隔的整數,其中第i個整數表示從...

Bellman Ford演算法,SPFA演算法

bellman ford 演算法能在更普遍的情況下 存在負權邊 解決單源點最短路徑問題。對於給定的帶權 有向或無向 圖g v,e 其源點為 s,加權函式w是 邊集e 的對映。對圖g執行 bellman ford 演算法的結果是乙個布林值,表明圖中是否存在著乙個從源點s 可達的負權迴路。若不存在這樣的...

Bellman ford 演算法詳解

昨天說的dijkstra固然很好用,但是卻解決不了負權邊,想要解決這個問題,就要用到bellman ford.我個人認為bellman ford比dijkstra要好理解一些,還是先上資料 有向圖 5 712 8135 23 6 5 4 324 735 2 45 3 在講述開,先設幾個陣列 orig...