1111. Online Map (30)

版权声明:https://github.com/godspeedcurry 欢迎加好友哦 https://blog.csdn.net/qq_38677814/article/details/82423682

码量充足 题意明确
dfs+spfa解法

#include <bits/stdc++.h>
using namespace std;
#define FORP(i,a,b) for(int i=a;i<=b;i++)
#define db(a) (cout<<"---"<<a<<endl)
#define mp(a,b) make_pair(a,b)
typedef pair<int,int> Pair;
vector<int> v[520];//lenth
int dd[700][700],tt[700][700];
int dist[1000],inq[1000];
void print(vector <int> s){
    for(int i=0;i<s.size();++i){
        printf(" -> %d",s[i]);
    }
    printf("\n");
}
void spfa(int x,int type){
    memset(dist,0x3f,sizeof(dist));
    memset(inq,0,sizeof(inq));
    dist[x]=0;
    queue<int> q;
    q.push(x);
    inq[x]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=0;i<v[u].size();++i){
            int to=v[u][i];
            int cost=(type?dd[u][to]:tt[u][to]);
            if(dist[u]+cost<dist[to]){
                dist[to]=dist[u]+cost;
                if(!inq[to]){
                    inq[to]=1;
                    q.push(to);
                }
            }
        }
        inq[u]=0;
    }
}
int vis[1000];
int source,destination;
vector<int> p,a,b;
int Maxt=0x3f3f3f3f;
void dfs(int x,int tot,int t,int type){
    if(tot<0) return;
    if(tot==0&&x==destination){
        if(type){//找最快的
            if(t<Maxt){
                Maxt=t;
                a=p;    
            }
        }
        else{//找点数最少的
            if(!b.size()) b=p;
            else if(p.size()<b.size())
                b=p;
        }
        return;
    }
    vis[x]=1;
    for(int i=0;i<v[x].size();++i){
        int to=v[x][i];
        int cost=(type?dd[x][to]:tt[x][to]);
        if(!vis[to]){
            vis[to]=1;
            p.push_back(to);
            dfs(to,tot-cost,t+tt[x][to],type);          
            vis[to]=0;
            p.pop_back();
        }
    }
}
int main(){
    int n,m;cin>>n>>m;
    memset(dd,0x3f,sizeof(dd));
    memset(tt,0x3f,sizeof(tt));
    FORP(i,1,m){
        int from,to,one,len,t;
        cin>>from>>to>>one>>len>>t;
        v[from].push_back(to);
        dd[from][to]=len;
        tt[from][to]=t;
        if(!one){
            v[to].push_back(from);
            tt[to][from]=t; 
            dd[to][from]=len;   
        } 
    }
    cin>>source>>destination;
    spfa(source,1);
    int Minlen=dist[destination];
    spfa(source,0);
    int Mintime=dist[destination];
    dfs(source,Minlen,0,1);
    dfs(source,Mintime,0,0);
    if(a!=b){
        printf("Distance = %d: %d",Minlen,source);
        print(a);
        printf("Time = %d: %d",Mintime,source);
        print(b);
    }
    else{
        printf("Distance = %d; Time = %d: %d",Minlen,Mintime,source);
        print(a);
    }
    return 0;   
}

猜你喜欢

转载自blog.csdn.net/qq_38677814/article/details/82423682