今天开始记录一下PAT刷的题8

断断续续写了十几题了 还是做个记录吧(没事找事
1030 Travel Plan (30分)
跟1003Emergency差不多 一个加点权一个加边权 在那个基础上改了一点 都是dijkstra 还是挺繁琐 但是能用就行

/*
    2020/03/14
    PAT A1030 Travel Plan
*/
#include <stdio.h>
#include <algorithm>
#include <stack>

#define INF 9999
using namespace std;
const int maxn=510;

struct Node{
    int length=INF;
    int cost=INF;
};


int vetnum, sidenum, c1,c2;
Node dist[maxn][maxn];
bool vis[maxn]={false};
int w[maxn]={0};
int d[maxn];
int pr[maxn];

void dij(){
    fill(d,d+maxn,INF);
    d[c1]=0;
    for(int i=0;i<vetnum;i++){
        pr[i]=-1;
    }
    for(int i=0;i<vetnum;i++){
        int miin=INF;
        int index=-1;
        for(int j=0;j<vetnum;j++){
            if(!vis[j] && d[j]<miin){
                index=j;
                miin=d[j];
            }
        }
        if(index==-1)return;
        vis[index]=true;
        for(int j=0;j<vetnum;j++){
            if(vis[j] || dist[index][j].length==INF)continue;
            if(dist[index][j].length!=INF && d[j]>d[index]+dist[index][j].length){
                d[j]=d[index]+dist[index][j].length;
                pr[j]=index;
                w[j]=w[index]+dist[index][j].cost;
            }
            else if(d[j]==d[index]+dist[index][j].length){
                if(dist[index][j].cost+w[index]<w[j]){
                    w[j]=dist[index][j].cost+w[index];
                    pr[j]=index;
                }
            }
        }

    }
}
int main(){
    scanf("%d %d %d %d",&vetnum,&sidenum,&c1,&c2);
    for(int i=0;i<sidenum;i++){
        int stt,ed,length,cost;
        scanf("%d %d %d %d",&stt,&ed,&length,&cost);
        dist[stt][ed].length=dist[ed][stt].length=length;
        dist[stt][ed].cost=dist[ed][stt].cost=cost;

    }
    dij();
    int temp=c2;
    stack<int> s;
    while(c2!=-1){
        s.push(c2);
        c2=pr[c2];
    }
    while(!s.empty()){
        printf("%d ",s.top());
        s.pop();
    }
    printf("%d %d",d[temp],w[temp]);
}

发布了31 篇原创文章 · 获赞 0 · 访问量 739

猜你喜欢

转载自blog.csdn.net/ttu___/article/details/104825051
今日推荐