最短路模板

来源:互联网 发布:linux怎么看内存大小 编辑:程序博客网 时间:2024/06/13 08:14

dijkstra+heap优化

struct edge{    int v,w,nxt;}e[M];struct node{    int len,num;    bool operator<(const node& t) const {return len>t.len;}}dis[N];priority_queue<node> q;int e_cnt,n,m;int vis[N],head[N];void Init(){    e_cnt=0;    memset(head,-1,sizeof(head));}void Addedge(int u,int v,int w){    /*for(int i=head[u];i!=-1;i=e[i].nxt)//判断重边    {        if(e[i].v==v)        {            if(e[i].w>w) e[i].w=w;            return;        }    }*/    e[e_cnt].v=v;    e[e_cnt].w=w;    e[e_cnt].nxt=head[u];    head[u]=e_cnt++;}void Dijkstra(int s){    memset(vis,0,sizeof(vis));    for(int i=1;i<=n;i++)    {        dis[i].len=inf;        dis[i].num=i;    }    dis[s].len=0;    q.push(dis[s]);    while(!q.empty())    {        node t=q.top();        q.pop();        int u=t.num;        if(vis[u]) continue;        vis[u]=1;        for(int i=head[u];i!=-1;i=e[i].nxt)        {            int len=e[i].w;            int v=e[i].v;            if(dis[v].len>dis[u].len+len)            {                dis[v].len=dis[u].len+len;                q.push(dis[v]);            }        }    }}

spfa

struct edge{    int v,w,nxt;}e[M];queue<int> q;int e_cnt,n,m;int vis[N],head[N],dis[N],in[N];void Init(){    e_cnt=0;    memset(head,-1,sizeof(head));}void Addedge(int u,int v,int w){    /*for(int i=head[u];i!=-1;i=e[i].nxt)//判断重边    {        if(e[i].v==v)        {            if(e[i].w>w) e[i].w=w;            return;        }    }*/    e[e_cnt].v=v;    e[e_cnt].w=w;    e[e_cnt].nxt=head[u];    head[u]=e_cnt++;}bool Spfa(int s){    memset(in,0,sizeof(in));    memset(vis,0,sizeof(vis));    for(int i=1;i<=n;i++)dis[i]=inf;    q.push(s);    dis[s]=0;    while(!q.empty())    {        int u=q.front();        q.pop();        vis[u]=0;        for(int i=head[u];i!=-1;i=e[i].nxt)        {            int v=e[i].v;            if(dis[v]>dis[u]+e[i].w)            {                dis[v]=dis[u]+e[i].w;                if(!vis[v])                {                    in[v]++;                    if(in[v]>n) return true;//有负环                    vis[v]=1;                    q.push(v);                }            }        }    }    return false;}

floyd

int n,m;int e[N][N];void Floyd(){    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            e[i][j]=(i==j)?0:inf;    for(int i=0;i<m;i++)    {        int u,v,w;        scanf("%d%d%d",&u,&v,&w);        e[u][v]=min(e[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(e[i][j]>e[i][k]+e[k][j]) e[i][j]=e[i][k]+e[k][j];}


0 0
原创粉丝点击