您的位置:首页 > 其它

最短路模板 floyd+dijkstra+spfa

2016-10-24 18:25 555 查看
floyd

void flyod()
{
for(int k = 1; k <= V; k ++)
for(int i = 1; i <= V; i ++)
for(int j = 1; j <= V; j ++)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}


dijkstra+heap

struct zt{
int v, d;
bool operator < (const zt b) const
{
return d > b.d;
}
};

priority_queue <zt> q;
void dijkstra(int s)
{
memset(dis, 63, sizeof(dis));
dis[s] = 0;
q.push((zt){s,0});
while(q.size())
{
int x = q.top().v;
q.pop();
if(done[x]) continue;
done[x] = 1;
for(int i = first[x]; i != -1; i = nxt[i])
{
int v = es[i].to;
if(dis[v] > dis[x] + es[i].cost)
{
dis[v] = dis[x] + es[i].cost;
q.push((zt){v,dis[v]});
}
}
}
}


SPFA

queue <int> q;
void spfa(int s)
{
memset(dis,63,sizeof(dis));
dis[s] = 0;
q.push(s);
used[s] = 1;
while(q.size())
{
int x = q.front();
q.pop();
used[x] = 0;
for(int i = first[x]; i != -1; i = nxt[i])
{
int v = es[i].to;
if(dis[v] > dis[x] + es[i].cost)
{
dis[v] = dis[x] + es[i].cost;
if(!used[v])
{
q.push(v);
used[v] = 1;
}
}
}
}
}


SPFA_SLF

deque <int> q;
void spfa(int s)
{
memset(dis,63,sizeof(dis));
dis[s] = 0;
q.push_front(s);
used[s] = 1;
while(q.size())
{
int x = q.front();
q.pop_front();
used[x] = 0;
for(int i = first[x]; i != -1; i = nxt[i])
{
int v = es[i].to;
if(dis[v] > dis[x] + es[i].cost)
{
dis[v] = dis[x] + es[i].cost;
if(!used[v])
{
if(q.empty()) q.push_back(v);
else if(dis[v] <= dis[q.front()]) q.push_front(v);
else q.push_back(v);
used[v] = 1;
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dijkstra 最短路 图论