題目:
參考:題意概括:
有乙個人有n塊農田和m條連線農田的道路,走每段路都需要花費一定的時間,同時他還非常熱衷於時間穿梭。他想要到達某一塊農田後能夠通過蟲洞穿越回他從起點出發之前的時間。如果他能夠實現這個願望就輸出yes,否則就輸出no。
我們都知道spfa演算法是對bellman演算法的優化
那麼如何用spfa演算法來判斷負權迴路呢?我們考慮乙個節點入隊的條件是什麼,
只有那些在前一遍鬆弛中改變了距離估計值的點,才可能引起他們的鄰接點的距離估計值的改變。
因此,用乙個先進先出的佇列來存放被成功鬆弛的頂點。同樣,我們有這樣的定理:「兩點間如果有最短路,
那麼每個結點最多經過一次。也就是說,這條路不超過n-1條邊。」
(如果乙個結點經過了兩次,那麼我們走了乙個圈。如果這個圈的權為正,顯然不划算;如果是負圈,
那麼最短路不存在;如果是零圈,去掉不影響最優值)。也就是說,每個點最多入隊n-1次
#include#include#include#include#include#include#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
typedef pairp;
const int maxn = 550;
int n,m,w,tot;
int dis[maxn];
int vis[maxn];
int head[maxn];
int num[maxn];
struct node
edge[maxn*maxn];
void add(int u,int v,int w)
bool spfa()
dis[1] = 0;
vis[1] = 1;
num[1] = 1;
queueq;
q.push(1);
while(!q.empty())}}
}return false;
}int main()
for(i=0; iif(spfa())
printf("yes\n");
else
printf("no\n");
}return 0;
}
spfa判定負環
我們用陣列記錄每個結點的最短路徑估計值,用鄰接表來儲存圖g。採取的方法是動態逼近法 1 設立乙個先進先出的佇列用來儲存待優化的結點。2 優化時每次取出隊首結點u,並且用u點當前的最短路徑估計值對離開u點所指向的結點v進行鬆弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的佇列中,就將v點放入...
模板 負環判定
存在負環,即 執行 spfa 演算法時,乙個點被更新了 n 次或 n 次以上,那麼一定存在負環。由於無向圖任意兩點間的簡單路徑經過的邊數均小於 n,且 b f 演算法在第 i 輪迭代結束時可以求得經過不超過 i 條邊得到的單源最短路。因此,在 n 1 次迭代時一定可以將所有點的最短路均求出。更高效率...
POJ3259負環判定
題意 有n個頂點,m條邊,然後有w個洞,過每個洞的時間為 ti,求是否會時光倒流 分析 就是求是否存在負圈,用bellman floyd判定是否存在負圈即可,注意是無向圖,所以路徑是雙向可達的 1 include 2 include 3 include 4 include 5 include 6 i...