最短路模板 floyd+dijkstra+spfa

来源:互联网 发布:mysql5.7数据库下载 编辑:程序博客网 时间:2024/05/20 07:35

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;                 }            }        }    }}
1 0