07-图6 旅游规划

本题是一个较为单纯的迪杰斯特拉算法,有两个权重<距离,费用>。根据题意先找出最短路,若最短路有若干条,则选最小费用的那条。需要注意的是此图初始化是一个无向图...........因为这个WA了N次

#include<bits/stdc++.h>
#define maxsize 505
#define inf 9999999
using namespace std;
int dist[maxsize];
int spend[maxsize][maxsize];
int g[maxsize][maxsize];
int cost[maxsize];
bool check[maxsize];
int n,m,s,d,mins,min_cost;
int c1,c2,h,f;
void dj();
void pre_deal();
int main()
{

    scanf("%d%d%d%d",&n,&m,&s,&d);
    pre_deal();
    for(int i=0;i<m;i++)///初始化无向图
    {
        scanf("%d%d%d%d",&c1,&c2,&h,&f);
        g[c1][c2]=h;
        g[c2][c1]=h;
        spend[c1][c2]=f;
        spend[c2][c1]=f;
    }
    dj();
    printf("%d %d\n",dist[d],cost[d]);


    return 0;
}
void pre_deal()///预处理权重为正无穷
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            g[i][j]=inf;
            spend[i][j]=inf;
        }
    }
}
void dj()
{
    for(int i=0;i<n;i++)
    {
        if(g[s][i]!=inf)///初始化源点的邻节点
        {
            dist[i]=g[s][i];
            cost[i]=spend[s][i];

        }
        else
            dist[i]=inf;
    }

    check[s]=true;///开始将源点加入最短路集合

    int w;
    for(int i=1;i<n;i++)
    {
        mins=inf;
        for(int j=0;j<n;j++)///从剩余集合中选取最短距离
            if(!check[j]&&dist[j]<mins)
            {
                mins=dist[j];
                w=j;
            }

        check[w]=true;///加入最短路集合
        for(int j=0;j<n;j++)
        {
            if(!check[j])
            if(dist[w]+g[w][j]<dist[j])///因为将w加入了最短路集合,所以要对剩余顶点进行更新
            {
                dist[j]=dist[w]+g[w][j];
                cost[j]=cost[w]+spend[w][j];

            }
            else if((dist[w]+g[w][j])==dist[j]&&(cost[w]+spend[w][j]<cost[j]))///有若干最短路时选取最小费用
                cost[j]=cost[w]+spend[w][j];
        }

    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值