floyd
floyd()
{
rep(k,1,n)
rep(i,1,n)
{
// if(a[i][k]==maxn||i==k) continue;
rep(j,1,n)
{
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
}
}
}
三重循環,k爲枚舉中間點
方便簡單,n3爆時間
spfa
void spfa()
{
for(int i=1;i<=n;i++) dis[i]=inf;
queue <int> q;
dis[v0]=0;q.push(v0);vis[v0]=1;
while(!q.empty())
{
int u=q.front();q.pop();vis[u]=0;
for(int i=e[u].head;i;i=e[i].next)
{
int v=e[i].v,w=e[i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v])
{q.push(v);vis[v]=1;}
}
}
}
}
最實用的,但可能會被數據卡成n*m
靠隊列更新,根據三角形定則來進行放縮;可判負環
只要判斷一個點進入次數是否大於n
Djstl
void Djstl(int x)
{
priority_queue<int,vector<int>,cmp> q;
dis[x]=0;q.push(x);
while(!q.empty())
{
int u=q.top();q.pop();
if(!tag[u])
{
tag[u]=1;
for(int i=e[u].first;i;i=e[i].next)
{
int v=e[i].v,w=e[i].w;
dis[v]=min(dis[v],dis[u]+w);
q.push(v);
}
}
}
}
加了一個堆優化nlogn;但不可以判負環!