1111 Online Map (30分)

单源最短路径,给定每条路的两个端点、长度、时间、是否单向,求给定起点到给定终点的最短路径长和最少时间路径长。若最短路径不唯一则输出时间最少的路径,若最少时间路径不唯一输出途径节点最少的路径。
用dijkstra走两遍,一次求最短路径一次求最短时间。按条件更新路径。vector存储起始点到当前点的当前最短路径。比对两个vector,如果一样就一起输出,不一样就分开输出。

#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
#include <math.h>

using namespace std;
int n,s;
const int maxn=510;
const int INF=99999;
struct Node{
    int length=INF,time=INF;
};
Node g[maxn][maxn];
vector<int> distv[maxn];
vector<int> timev[maxn];
int dist[maxn];
int time[maxn];
bool vis[maxn];
void dij(int s){
    fill(dist,dist+maxn,INF);
    dist[s]=0;
    for(int i=0;i<n;i++){
        int u=-1,minn=INF;
        for(int j=0;j<n;j++){
            if(!vis[j] && dist[j]<minn){
                u=j;
                minn=dist[j];
            }
        }
        if(u==-1)return;
        vis[u]=true;
        //distv[u].push_back(u);
        for(int v=0;v<n;v++){
            if(!vis[v] && g[u][v].length!=INF ){
                if(dist[u]+g[u][v].length<dist[v] || (dist[u]+g[u][v].length==dist[v] && time[v]>time[u]+g[u][v].time)){
                    dist[v]=dist[u]+g[u][v].length;
                    time[v]=time[u]+g[u][v].time;
                     distv[v]=distv[u];
                    distv[v].push_back(v);
                }
            }
        }
    }

    fill(time,time+maxn,INF);
    fill(vis,vis+maxn,false);
    time[s]=0;
    for(int i=0;i<n;i++){
        int u=-1,minn=INF;
        for(int j=0;j<n;j++){
            if(!vis[j] && time[j]<minn){
                u=j;
                minn=time[j];
            }
        }
        if(u==-1)return;
        vis[u]=true;
        for(int v=0;v<n;v++){
            if(!vis[v] && g[u][v].time!=INF ){
                if(time[u]+g[u][v].time<time[v] || (time[u]+g[u][v].time==time[v] && timev[u].size()<timev[v].size()-1)){
                    time[v]=time[u]+g[u][v].time;
                    timev[v]=timev[u];
                    timev[v].push_back(v);
                }
            }
        }
    }
}
int main() {
    scanf("%d %d",&n,&s);
    for(int i=0;i<s;i++){
        int v1,v2,oneway,length,time;
        scanf("%d%d%d%d%d",&v1,&v2,&oneway,&length,&time);
        g[v1][v2].length=length;
        g[v1][v2].time=time;
        if(oneway==0)g[v2][v1]=g[v1][v2];
    }
    int s,e;
    scanf("%d %d",&s,&e);
    dij(s);
    bool fl=true;
    if(timev[e].size()==distv[e].size()){
        auto itt=timev[e].begin();
        auto itd=distv[e].begin();
        for(;itt!=timev[e].end() && itd!=distv[e].end();itt++,itd++){
            if(*itt!=*itd){
                fl=false;
                break;
            }
        }
    }else fl=false;
    
    if(!fl){
        printf("Distance = %d: %d",dist[e],s);
        for(int i=0;i<distv[e].size();i++){
            printf(" -> %d",distv[e][i]);
        }
        printf("\nTime = %d: %d",time[e],s);
        for(int i=0;i<timev[e].size();i++){
            printf(" -> %d",timev[e][i]);
        }
    }else{
        printf("Distance = %d; Time = %d: %d",dist[e],time[e],s);
        for(int i=0;i<timev[e].size();i++){
            printf(" -> %d",timev[e][i]);
        }
    }
}
发布了27 篇原创文章 · 获赞 0 · 访问量 562
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览