PAT甲级题目1030 Travel Plan

代码:

#include<bits/stdc++.h>
using namespace std;
int Cost[505][505],Dis[505][505];//存储每条边的权重、距离
int dis[505],cost[505],pathLast[505];//存储起点到该点的最短距离、起点到该点的最小权重、路径
bool visit[505];//存储起点到该点是否已被访问
int N,M,S,D;
void Dijkstra(){
    while(!visit[D]){//如果终点还没有被访问到
        int v=-1,MIN=INT_MAX;//在当前未访问的结点中找到距离最小的结点
        for(int i=0;i<N;++i)
            if(!visit[i]&&dis[i]<MIN){
                MIN=dis[i];
                v=i;
            }
        if(v==-1) return;//该图不是连通图,直接返回
        visit[v]=true;//置该点已被访问
        for(int i=0;i<N;++i)//遍历该点能够到达的结点并更新相关信息
            if(!visit[i]&&Dis[v][i]!=0&&dis[i]>dis[v]+Dis[v][i]){
                dis[i]=dis[v]+Dis[v][i];
                cost[i]=cost[v]+Cost[v][i];
                pathLast[i]=v;
            }else if(Dis[v][i]!=0&&dis[i]==dis[v]+Dis[v][i]&&cost[i]>cost[v]+Cost[v][i]){
                cost[i]=cost[v]+Cost[v][i];
                pathLast[i]=v;
            }
    }
}
void DFS(int v){//深度优先遍历输出最短路径
    if(v==S)
        printf("%d",v);
    else{
        DFS(pathLast[v]);
        printf(" %d",v);
    }
}
int main(){
    scanf("%d%d%d%d",&N,&M,&S,&D);
    for(int i=0;i<M;++i){
        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        Dis[a][b]=Dis[b][a]=c;
        Cost[a][b]=Cost[b][a]=d;
    }
    fill(dis,dis+N,INT_MAX);
    fill(cost,cost+N,INT_MAX);
    dis[S]=cost[S]=0;
    Dijkstra();
    DFS(D);
    printf(" %d %d",dis[D],cost[D]);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值