双重权值(SPFA算法)

来源:互联网 发布:美国gdp数据公布网站 编辑:程序博客网 时间:2024/05/17 03:39

试题描述:

给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离
有多条路线,则输出花费最少的。

输入要求:
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数
s,t;起点s,终点t。(1

#include <stdio.h>#include <stdlib.h>#include <iostream>#include <string>#include <queue>using namespace std;#define MAX 1002#define INT 1000000int w[MAX];int cost[MAX];bool vis[MAX];struct node{    int w,cost;}map1[MAX][MAX];int n,m,a,b,d,p,s,t;void SPFA(){    queue<int> q;    q.push(s);    w[s]=0;    cost[s]=0;    vis[s]=true;    while(!q.empty())    {        int cur=q.front();        q.pop();        vis[cur]=true;        for(int i=1;i<=n;i++)        {            if(map1[cur][i].w!=INT&&w[i]>=w[cur]+map1[cur][i].w)            {                w[i]=w[cur]+map1[cur][i].w;                cost[i]=min(cost[i],cost[cur]+map1[cur][i].cost);                if(!vis[i]){                    vis[i]=true;                    q.push(i);                }            }        }    }}int main(){        scanf("%d %d",&n,&m);        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                map1[i][j].w=INT;                map1[i][j].cost=INT;            }            w[i]=INT;            cost[i]=INT;            vis[i]=false;        }        for(int i=1;i<=m;i++)        {            scanf("%d %d %d %d",&a,&b,&d,&p);            map1[a][b].w=map1[b][a].w=d;            map1[a][b].cost=map1[b][a].cost=p;        }        scanf("%d %d",&s,&t);        SPFA();        printf("%d %d\n",w[t],cost[t]);    return 0;}
0 0
原创粉丝点击