【模板】最短路

来源:互联网 发布:移动4g网络加速器 编辑:程序博客网 时间:2024/05/07 14:03

裸·最短路
权当模板存着

1.spfa 优化:无

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int MAXN = 200005;int first[MAXN],next[MAXN],dis[MAXN];int tot = 0,n,m,ss,ee,f,t,v;bool use[MAXN];struct edge{    int f,t,v;}l[MAXN];void build(int f,int t,int v){    l[++ tot] = (edge){f,t,v};    next[tot] = first[f];    first[f] = tot;    return;}queue < int > q;void spfa(int s){    memset(use,0,sizeof(use));    memset(dis,0x3f,sizeof(dis));    while(!q.empty())   q.pop();    dis[s] = 0,use[s] = true;    q.push(s);    while(!q.empty())    {        int u = q.front();        use[u] = false;        q.pop();        for(int i = first[u]; i != -1; i = next[i])        {            int w = l[i].t;            if(dis[w] > dis[u] + l[i].v)            {                dis[w] = dis[u] + l[i].v;                if(use[w])  continue;                q.push(w);                use[w] = true;              }        }    }    return;}int main(){    memset(first,0xff,sizeof(first));    scanf("%d %d %d %d",&n,&m,&ss,&ee);    for(int i = 1; i <= m; i ++)    {        scanf("%d %d %d",&f,&t,&v);        build(f,t,v);        build(t,f,v);       }    spfa(ss);    printf("%d\n",dis[ee]);    return 0;}

2.spfa_slf 优化:双端队列

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int MAXN = 200005;int n,m,ss,e,f,t,v;int tot = 0;int first[MAXN],next[MAXN],dis[MAXN];bool use[MAXN];struct edge{    int f,t,v;}l[MAXN];void build(int f,int t,int v){    l[++ tot] = (edge){f,t,v};    next[tot] = first[f];    first[f] = tot;    return;}deque < int > q;void spfa(int s){    memset(use,0,sizeof(use));    memset(dis,0x3f,sizeof(dis));    use[s] = true;    dis[s] = 0;    while(!q.empty())   q.pop_front();    q.push_back(s);    while(!q.empty())    {        int u = q.front();        use[u] = false;        q.pop_front();        for(int i = first[u]; i != -1; i = next[i])        {            int w = l[i].t;            if(dis[w] > dis[u] + l[i].v)            {                dis[w] = dis[u] + l[i].v;                if(use[w] == false)                {                    use[w] = true;                    if(q.empty())   q.push_back(w);                    else if(dis[w] < dis[q.front()])                        q.push_front(w);                    else                        q.push_back(w);                }            }        }    }    return; }int main(){    memset(first,0xff,sizeof(first));    scanf("%d %d %d %d",&n,&m,&ss,&e);    for(int i = 1; i <= m; i ++)     {        scanf("%d %d %d",&f,&t,&v);        build(f,t,v);        build(t,f,v);    }    spfa(ss);    printf("%d\n",dis[e]);    return 0;}

3.Dijkstra 优化:无

//久一点了的打法

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 400000 + 5;int first[MAXN],next[MAXN],dis[MAXN],tot;bool use[MAXN];int tk,c,ts,te;int f,t,v;struct edge{    int f,t,v;}l[MAXN];void build(int f,int t,int v){    l[++ tot] = (edge){f,t,v};    next[tot] = first[f];    first[f] = tot;    return;}void dij(int s){    memset(use,0,sizeof(use));    memset(dis,0x3f,sizeof(dis));    dis[s] = 0;//  memset(first,0xff,sizeof(first));    while(true)    {        int now = -1;        int nowdist = 0x7fffffff;        for(int i = 1; i <= tk; i ++)        {            if(nowdist > dis[i] && !use[i])            {                now = i;                nowdist = dis[i];            }        }            if(now == -1)   return;            use[now] = 1;            for(int i = first[now]; i != -1; i = next[i])            {                int w = l[i].t;                if(dis[w] > dis[now] + l[i].v)                    dis[w] = dis[now] + l[i].v;            }    }}int main(){    memset(first,0xff,sizeof(first));    scanf("%d %d %d %d",&tk,&c,&ts,&te);    for(int i = 1; i <= c; i ++)    {        scanf("%d %d %d",&f,&t,&v);        build(f,t,v);        build(t,f,v);    }    dij(ts);    printf("%d\n",dis[te]);    return 0;}

4.dij_heap 优化:堆

#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <queue>#include <algorithm>using namespace std;const int MAXN = 400000 + 5;int first[MAXN],next[MAXN],dis[MAXN],tot;bool use[MAXN];int tk,c,ts,te;int f,t,v;struct edge{    int f,t,v;}l[MAXN];struct dot{    int num,dis;};bool operator<(dot a,dot b){    return a.dis > b.dis;}void build(int f,int t,int v){    l[++ tot] = (edge){f,t,v};    next[tot] = first[f];    first[f] = tot;    return;}priority_queue<dot>q;/*void dij_heap(int s){    memset(use,0,sizeof(use));    memset(dis,0x3f,sizeof(dis));    while(!q.empty())   q.pop();    dis[s] = 0;    q.push((dot){s,dis[s]});    while(!q.empty())    {        dot now = q.top();        use[now.num] = 1;        q.pop();        for(int i = first[now.num] ; i != -1; i = next[i])        {            int w = l[i].t;            if(dis[w] > dis[now.num] + l[i].v)            {                dis[w] = dis[now.num] + l[i].v;                if(!use[w]) q.push((dot){w,dis[w]});            }        }    }}*/void dij_heap(int s){    memset(use,0,sizeof(use));    memset(dis,0x3f,sizeof(dis));    while(!q.empty())        q.pop();    dis[s] = 0;    q.push((dot){s,dis[s]});    while(!q.empty())    {        int u = q.top().num;        use[u] = 1;        q.pop();        for(int i = first[u]; i != -1; i = next[i])        {            int w = l[i].t;            if(dis[w] > dis[u] + l[i].v)            {                dis[w] = dis[u] + l[i].v;                if(!use[w]) q.push((dot){w,dis[w]});            }        }    }}int main(){    memset(first,0xff,sizeof(first));    scanf("%d %d %d %d",&tk,&c,&ts,&te);    for(int i = 1; i <= c; i ++)    {        scanf("%d %d %d",&f,&t,&v);        build(f,t,v);        build(t,f,v);    }    dij_heap(ts);    printf("%d\n",dis[te]);    return 0;}

//下面这个 近一点

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;const int MAXN = 200005;int first[MAXN],next[MAXN],dis[MAXN];bool use[MAXN];int n,m,ss,ee,tot = 0;struct edge{    int f,t,v;}l[MAXN];struct zt{    int u,v;    bool operator < (const zt &b)const    {        return v > b.v;    }};void build(int f,int t,int v){    l[++ tot] = (edge){f,t,v};    next[tot] = first[f];    first[f] = tot;    return;}priority_queue < zt > q;void dij(int s,int e ){    memset(dis,0x3f,sizeof(dis));    memset(use,0,sizeof(use));    dis[s] = 0;//  use[s] = true;//这是dij不是spfa!!!     while(!q.empty())   q.pop();    q.push((zt){s,0});    while(!q.empty())    {        zt x = q.top();        q.pop();        int u = x.u;        if(use[u])  continue;        use[u] = true;        if(u == e)  return;        for(int i = first[u]; i != -1; i = next[i])        {            int w = l[i].t;            if(dis[w] > dis[u] + l[i].v)            {                dis[w] = dis[u] + l[i].v;                q.push((zt){w,dis[w]});            }        }    }    return;}int f,t,v;int main(){    memset(first,0xff,sizeof(first));    scanf("%d %d %d %d",&n,&m,&ss,&ee);    for(int i = 1; i <= m ; i ++)    {        scanf("%d %d %d",&f,&t,&v);        build(f,t,v);        build(t,f,v);    }    dij(ss,ee);    printf("%d\n",dis[ee]);    return 0;}
0 0
原创粉丝点击