1. 程式人生 > >7-9 旅遊規劃 (25 分)

7-9 旅遊規劃 (25 分)

題目連結

//這個題跟個板題差不多,跌死啦演算法,暑假第一週學過,當時學的挺明白的,現在就都忘了,又重新看了看網課,不錯,稍微看一點就行了,DIj用來計算兩個點的最短路徑,就是不斷找最短的路,然後一次次的更新就行了。哎

怎麼都忘了 。。 

這個題我弄了個結構體就來存路長和過路費,然後跟板子一樣。

還有今天大學的運動會結束了,應該是人生最後一次參加運動會了(儘管這次沒有報專案),我覺得應該記錄一下,儘管這兩天非常無聊,還掉了一小塊牙,但這是最後一次,值得寫一下。

#include <iostream>
#include <cstring>
#include <cstdio>
#define INF 0x3f3f3f3f
using namespace std;
struct node{
    int dst;
    int cost;
    node():dst(INF),cost(INF) {
    }
};
int N,M,S,D;
node mp[510][510];
node dis[510];
int book[510];
void dij(int s,int e){
    dis[s].cost=0;
    dis[s].dst=0;
    int i,j;
    for(int i=0;i<N;i++){
        int minw=INF;
        int minv;
        int minc=INF;
        for(j=0;j<N;j++){
            if(book[j]) continue;
            if(dis[j].dst<minw){
                minv=j;
                minc=dis[j].cost;
                minw=dis[j].dst;
            }
            else if(dis[j].dst==minw){
                if(dis[j].cost<minc){
                    minv=j;
                    minc=dis[j].cost;
                    minw=dis[j].dst;
                }
            }
        }
        //cout<<minv<<minc<<minw<<endl;
        book[minv]=1;
        if(minv==e) break;
        for(j=0;j<N;j++){
            if(book[j] || !mp[minv][j].dst)
                continue;
            if(dis[j].dst>dis[minv].dst+mp[minv][j].dst){
                dis[j].dst=dis[minv].dst+mp[minv][j].dst;
                dis[j].cost=dis[minv].cost+mp[minv][j].cost;
            }
            else if(dis[j].dst==dis[minv].dst+mp[minv][j].dst){
                if(dis[j].cost > dis[minv].cost+mp[minv][j].cost){
                dis[j].dst=dis[minv].dst+mp[minv][j].dst;
                dis[j].cost=dis[minv].cost+mp[minv][j].cost;
                }
            }
        }
    }
    cout<<dis[e].dst<<" "<<dis[e].cost<<endl;
}
int main(){
    int a,b,c,d;
    memset(dis,INF,sizeof(dis));
    memset(book,0,sizeof(book));
    memset(mp,INF,sizeof(mp));
    scanf("%d%d%d%d",&N,&M,&S,&D);  //S是出發地 D是目的地  N是城市個數 M是公路條數
    for(int i=1;i<=M;i++){
        cin>>a>>b>>c>>d;
        if(c>mp[a][b].dst ||  d>mp[a][b].cost) continue;
        mp[a][b].dst=c;
        mp[b][a].dst=c;
        mp[a][b].cost=d;
        mp[b][a].cost=d;
    }
    dij(S,D);

    return 0;
}