最短路 Dijkstra

来源:互联网 发布:js正则匹配多个字符串 编辑:程序博客网 时间:2024/06/05 22:56

Dijkstra 单源最短路 邻接矩阵形式

/**单源最短路径,Dijkstra算法,邻接矩阵形式,复杂度为o(n^2)*求出源beg到所有点的最短路径,传入图的顶点数和邻接矩阵cost[][]*返回各点的最短路径lowcost[],路径pre[],pre[i]记录beg到i路径上的父节点,pre[beg]=-1;*可更改路径权类型,但是权值必须为非负,下表0~n-1*/‘const int MAXN=1010;const int INF=0x3f3f3f3f;bool vis[MAXN];int pre[MAXN];void Dijkstra(int cost[][MAXN],int lowcost[],int n,int beg){    for(int i=0;i<n;i++)    {        lowcost[i]=INF;        vis[i]=false;        pre[i]=-1;            }    lowcost[beg]=0;    for(int j=0;j<n;j++)    {        int k=-1;        int min=INF;        for(int i=0;i<n;i++)        {            if(!vis[i]&&lowcost[i]<min)            {                min=lowcost[i];                k=i;            }        }        if(k==-1)        {            break;        }        vis[k]=true;        for(int i=0;i<n;i++)        {            if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i])            {                lowcost[i]=lowcost[k]+cost[k][i];                pre[i]=k;            }        }                }}
Dijkstra单源最短路 邻接矩阵形式 双路径信息

/**单源最短路径,dijkstra算法,邻接矩阵形式,复杂度为o(n^2)*两点间距离存入map[][],两点间花费存入cost[][]*求出源st到所有点的最短路径及其对应最小花费*返回各点的最短路径lowdis[]以及对应的最小花费lowval[]*可更改路径权类型,但是权值必须为非负,下标1~n*/const int MAXN=1010;const int INF=0x3f3f3f3f;int n,m;int lowdis[MAXN];int lowval[MAXN];int visit[MAXN];int map[MAXN][MAXN];int cost[MAXN][MAXN];void dijkstra(int st){    int temp=0;    for(int i=1;i<=n;i++)    {        lowdis[i]=map[st][i];        lowval[i]=cost[st][i];    }    memset(visit,0,sizeof(visit));    visit[st]=1;    for(int i=1;i<n;i++)    {        int MIN=INF;        for(int j=1;j<=n;j++)        {            if(!visit[j]&&lowdis[j]<MIN)            {                temp=j;                MIN=lowdis[j];            }        }        visit[temp]=1;        for(int j=1;j<=n;j++)        {            if(!visit[j]&&map[temp][j]<INF)            {                if(lowdis[j]>lowdis[temp]+map[temp][j])                {                    lowdis[j]=lowdis[temp]+map[temp][j];                    lowval[j]=lowval[temp]+cost[temp][j];                }                else if(lowdis[j]==lowdis[temp]+map[temp[j])                {                    if(lowval[j]>lowval[temp]+cost[temp][j])                    {                        lowval[j]=lowval[temp]+cost[temp][j];                    }                }                                }        }    }    return;        }

Dijkstra起点Start结点有权值

#define M 505const int inf=0x3f3f3f3f;int num[M];    //结点权值int map[M][M];  //图的临近矩阵int vis[M];     //结点是否处理过int ans[M];     //最短路径结点权值和int dis[M];     //各点最短路径花费int n,m,Start,End;    //n结点数,m边数,Start起点,End 终点void Dij(int v){    ans[v]=num[v];    memset(vis,0,sizeof(vis));    for(int i=0;i<n;i++)    {        if(map[v][i]<inf)        {            ans[i]=ans[v]+num[i];        }        dis[i]=map[v][i];    }    dis[v]=0;    vis[v]=1;    for(int i=1;i<n;i++)    {        int u=0,min=inf;        for(int j=0;j<n;j++)        {            if(!vis[j]&&dis[j]<min)            {                min=dis[j];                u=j;            }        }        vis[u]=1;        for(int k=0;k<n;k++)        {            if(!vis[k]&&dis[k]>map[u][k]+dis[u])            {                dis[k]=map[u][k]+dis[u];                ans[k]=ans[u]+num[k];            }        }        for(int k=0;k<n;k++)        {            if(dis[k]==map[u][k]+dis[u])            {                ans[k]=max(ans[k],ans[u]+num[k]);            }        }    }    printf("%d %d\n",dis[End],ans[End]);//输出终点最短路径花费、最短路径结点权值和}int main(){    scanf("%d%d%d%d",&n,&m,&Strat,&End);    for(int i=0;i<n;i++)        scanf("%d",&num[i]);    memset(vis,0,sizeof(vis));    memset(map,0x3f,sizeof(map));    for(int i=0;i<m;i++)    {        int x,y,z;        scanf("%d%d%d",&x,&y,&z);        if(map[x][y]>z)        {            map[x][y]=z;            map[y][x]=z;        }    }    Dij(Start);    return 0;}


1 0
原创粉丝点击