呃最短路要最好需要掌握的三種演算法:dijkstra、spfa、floyd;
區別在於:
·dijkstra最好用於稠密圖;
·spfa最好用於稀疏圖;
·floyd可以用來寫閉包(huaji)
·其他區別因為太菜暫時不列出來
先上個spfa模板:
#include#includeview code#include
#include
#include
#include
#include
using
namespace
std;
#define reg register
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define up(i,x,y) for(register int i=x;i>=y;i--)
#define in inline
#define inf 0x3f3f3f3f
const
int maxn=2505,maxm=6205
;int dis[maxn]=,head[maxm*2]=,tot=0
,n,m,ts,te;
bool vis[maxn]=;
struct
edgeh[maxm*2
];queue
q;in void add(int u,int v,int
w)in
void
spfa()}}
}}int
main()
spfa();
printf("%d
",dis[te]);
return0;
}
·負環:進隊次數》n就有負環;或開陣列記錄步數(最短路路徑條數),步數》n即有負環。
in void spfa(intview codes)
else
spfa(to);}}
vis[s]=0
;}
再來個dijkstra模板(堆優化):
(因現在水平真心菜,等更好理解重新不醜的)
#include#includeview code#include
#include
#include
#include
#include
using
namespace
std;
#define reg register
#define rep(i,x,y) for(register int i=x;i<=y;i++)
#define up(i,x,y) for(register int i=x;i>=y;i--)
#define in inline
#define inf 0x7fffffff
struct
node
};int
n,m,s;
bool visit[10050
];int dis[500050
];vector
g[10050
];priority_queue
q;int
main()
); }
dis[s]=0
; q.push((node));
while (!q.empty()));}
}}
for (int i=1;i<=n;i++)
printf(
"%d
",dis[i]);
printf("\n
");return0;
}
然後就是floyd,這個真心不會,只能來個裸的三迴圈:
rep(k,1接著來個差分約束系統:,n) rep(i,
1,n)
rep(j,
1,n)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
先來個 兩邊夾定理:a-b=c <=> a-b>=c&&a-b<=c,
還有著名的三角形不等式;
應用:1、線性約束:
對於所有滿足d[x] - d[y] <= z的不等式,從y向x建立一條權值為z的有向邊。
然後從起點1出發,利用spfa求到各個點的最短路,如果1到n不可達,說明最短路(即上文中的t)無限長,輸出-2。如果某個點進入佇列大於等於n次,則必定存在一條負環,即沒有最短路,輸出-1。否則t就等於1到n的最短路。
2、區間約束;
3、未知條件約束:指在不等式的右邊不一定是個常數,可能是個未知數,可以通過列舉這個未知數,然後對不等式轉化成差分約束進行求解
注意;1、可以開二維來進行其它的判斷(例如 顏色不同的路才能走)
(待完善)
最短路模板
1.dijkstra演算法 演算法思想 從某乙個點開始,找與它距離最近的乙個點,然後更新所有點到這條路徑的距離,然後再次選取乙個距離上乙個點路徑最短的點,將其加入路徑,以此進行,直到求出起點到所有點的最短距離.注意 權值不能為負,如圖 1到3的距離應該是零,但這裡結果為一 1 鄰接矩陣 複雜度 o ...
最短路模板
週六週日tyvj上有模擬賽 順便逃了周練 霧 複習了一下圖論裡的基本演算法 彷彿第一次寫最短路的手生 寫的太少了 orz dijkstra include define maxn 10001 define maxm 300001 using namespace std template void r...
最短路模板
include include include include include include define inf 0x3f3f3f3f using namespace std const int maxn 105 int dis maxn pre maxn struct edge 邊 edge ...