最短路模板(dijkstra+邻接表)

来源:互联网 发布:dnf数据芯片会涨价吗 编辑:程序博客网 时间:2024/05/22 19:32
#include<iostream>#include<algorithm>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<queue>#include<math.h>#include<set>#include<vector>using namespace std;#define maxn 550#define MM 10000000int V[maxn];int d[maxn];int fa[maxn];int first[maxn],next[maxn],w[maxn],u[maxn],v[maxn];int n,m;void read_(){                   //单向 or 双向均可~    scanf("%d%d",&n,&m);    memset(first,-1,sizeof(first));    for(int i=1;i<=m;i++)    {        scanf("%d%d%d",&u[i],&v[i],&w[i]);        next[i]=first[u[i]];        first[u[i]]=i;    }   //双向路径    for(int i=m+1;i<=2*m;i++)    {        u[i]=v[i-m];        v[i]=u[i-m];        w[i]=w[i-m];        next[i]=first[u[i]];        first[u[i]]=i;    }}void Dijjkstra(){    memset(V,0,sizeof(V));    memset(fa,0,sizeof(fa));    for(int i=1;i<=n;i++)        d[i]=(i==1?0:MM);    for(int i=1;i<=n;i++)    {        int x,mm=MM;        for(int j=1;j<=n;j++)            if(d[j]<mm && !V[j])            mm=d[x=j];            V[x]=1;          for(int e=first[x];e!=-1;e=next[e])          {              if(d[v[e]]>d[x]+w[e])              {                  d[v[e]]=d[x]+w[e];                  fa[v[e]]=x;              }          }    }}void dfs(int x ) //输出路径{    cout<<x<<endl;    if(fa[x]==0)        return;    else  {        dfs(fa[x]);        if(x==n)      cout<<fa[x];      else      cout<<fa[x]<<' ';  }}int main(){    read_();    Dijjkstra();    dfs(n);     //输出路径:可更改终点值。    cout<<' '<<n<<endl;   return 0;}
其他的模板会陆续上传~
0 0
原创粉丝点击