【模板】【图论】最短路

来源:互联网 发布:淘宝网御龙在天激活码 编辑:程序博客网 时间:2024/06/06 07:50

最近打算整理一下noip范围内的各种板子,就从最短路开始吧。
因为是给自己看的所以没加注释233

Dijkstra:

#include <algorithm>#include <cstdio>#include <queue>using namespace std;const int mxn =10003,mxm =500003,inf=0x7fffffff;struct Edge{    int nx,to,val;}e[mxm];struct Node{    int d,u;    bool operator < (const Node &x) const{        return x.d<d;    }};int hd[mxn];int vis[mxn];int dis[mxn];int n,m,s,ecnt;inline void add_edge(int u,int v,int w){    e[++ecnt].nx=hd[u];    hd[u]=ecnt;    e[ecnt].to=v;    e[ecnt].val=w;}void Dijkstra(int s){    priority_queue<Node>q;    for(int i=1;i<=n;i++) dis[i]=inf;    dis[s]=0;    q.push((Node){0,s});    while(!q.empty())    {        Node x=q.top();q.pop();        int u=x.u;        if(vis[u]) continue;        vis[u]=true;        for(int i=hd[u];i;i=e[i].nx)        {            int v=e[i].to;            if(dis[v]>dis[u]+e[i].val)            {                dis[v]=dis[u]+e[i].val;                q.push((Node){dis[v],v});            }        }    }}int main(){    scanf("%d%d%d",&n,&m,&s);    for(int i=1;i<=m;i++)    {        int u,v,w;        scanf("%d%d%d",&u,&v,&w);        add_edge(u,v,w);    }    Dijkstra(s);    for(int i=1;i<=n;i++) printf("%d ",dis[i]);    printf("\n");    return 0;}

SPFA:

#include <algorithm>#include <cstdio>#include <queue>using namespace std;const int mxn =10003,mxm =500003,inf=0x7fffffff;struct Edge{    int nx,to,val;}e[mxm];int hd[mxn];int inq[mxn];int dis[mxn];int n,m,s,ecnt;inline void add_edge(int u,int v,int w){    e[++ecnt].nx=hd[u];    hd[u]=ecnt;    e[ecnt].to=v;    e[ecnt].val=w;}void spfa(int s){    queue<int>q;    for(int i=1;i<=n;i++) dis[i]=inf;    dis[s]=0;    q.push(s);    inq[s]=true;    while(!q.empty())    {        int u=q.front();q.pop();        inq[u]=false;        for(int i=hd[u];i;i=e[i].nx)        {            int v=e[i].to;            if(dis[v]>dis[u]+e[i].val)            {                dis[v]=dis[u]+e[i].val;                if(!inq[v])                {                    q.push(v);                    inq[v]=true;                }            }        }    }}int main(){    scanf("%d%d%d",&n,&m,&s);    for(int i=1;i<=m;i++)    {        int u,v,w;        scanf("%d%d%d",&u,&v,&w);        add_edge(u,v,w);    }    spfa(s);    for(int i=1;i<=n;i++) printf("%d ",dis[i]);    printf("\n");    return 0;}

Floyed:

#include <cstdio>#include <algorithm>using namespace std;const int mxn =103,inf=0x7fffffff;int g[mxn][mxn];int n,m,s;int main(){    scanf("%d%d%d",&n,&m,&s);    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            g[i][j]=inf;    for(int i=1;i<=m;i++)    {        int u,v,w;        scanf("%d%d%d",&u,&v,&w);        g[u][v]=min(g[u][v],w);    }    for(int k=1;k<=n;k++)        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++) if(g[i][k]!=inf&&g[k][j]!=inf)                g[i][j]=min(g[i][j],g[i][k]+g[k][j]);    for(int i=1;i<=n;i++) g[i][i]=0;    for(int i=1;i<=n;i++) printf("%d ",g[s][i]);    printf("\n");    return 0;}

后记:这样的博客还真是简单粗暴又好写- -

原创粉丝点击