spfa演算法:
spfa演算法是圖論中主要應用於解決帶負權圖相關問題的一種演算法,它死了。於是板子題又雙叒叕應運而生:時間複雜度:o(ke)//k為平均每個節點入隊次數
演算法思路:
1,建立先進先出佇列存放待優化結點;
2,每次去除當前隊首結點u,用u最短路徑估計值將與u相連的結點v進行鬆弛操作,若v最短路徑被更新且v不在佇列中,將v加入隊尾;
(鬆弛操作:對,每個集合中的節點v,都設定dis[v]表示起點與v間最短路徑權值的上界的操作
3,重複上述操作直至隊列為空。
1 #include2#define ff(i,s,e) for(int i=s;i<=e;i++)
3#define fff(i,s,e) for(int i=s;i>=e;i--)
4using
namespace
std;
5 inline int
read()
9while(ch>='
0'&&ch<='9')
10return x*f;11}
12const
int n=2010,m=3010,inf=0x3f3f3f3f;13
intn,m;
14int
tal,head[n];
15int
dis[n];
16int mark[n];//
元素i被標記過幾次
17bool vis[n];//
元素i是否在佇列中
18struct
qwqa[m*2
];21 queueq;
22void add(int u,int v,int w)
28bool
spf()
44if(mark[v]>=n) return
1;//
判斷負環,可由鬆弛原理推導 45}
46}47}
48return0;
49}50int
main()
61if(spf()) printf("
yes\n");
62else printf("
no\n");
63}64return0;
65 }
阿巴阿巴
洛谷 P3385 負環
聽說這道題有好幾種做法?超神搜尋?bfs?spfa?奇怪的貪心?管理員更新了資料,別想了qwq.可能是我太菜了,想不出吧.說說我的解法 我們就做普通的spfa,不要加什麼酸辣粉slf優化,會超時 判斷每個點進佇列的的次數,如果次數超過了n次,說明存在負環.證明,自己想一想也許就可以了吧,如果乙個點多...
模板 SPFA判負環(洛谷P3385)
給定乙個n個點m條邊有向圖,每條邊有乙個權值,試判斷圖中是否存在負環。第一行乙個正整數t表示資料組數,對於每組資料 第一行兩個正整數n m,表示圖有n個頂點,m條邊 接下來m行,每行三個整數a b w,表示a b有一條權值為w的邊 若w 0則為單向,否則雙向 共t行。對於每組資料,存在負環則輸出一行...
洛谷 P3385 模板 負環
暴力列舉 spfa bellman ford 奇怪的貪心 超神搜尋 輸入格式 第一行乙個正整數t表示資料組數,對於每組資料 第一行兩個正整數n m,表示圖有n個頂點,m條邊 接下來m行,每行三個整數a b w,表示a b有一條權值為w的邊 若w 0則為單向,否則雙向 輸出格式 共t行。對於每組資料,...