PAT A-1030 Travel Plan (30 points)

Topic: 1030 Travel Plan (30 points)
Analysis : pure DFS, record path, shortest dis and minimum cost
#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<stack>
#include<algorithm>
#include<map>
#include<set>
#define MAX 99999999
using namespace std;
typedef long long ll;

int n,m;
int road[501][501];
int dis[501][501];
int cost[501][501];
int visi[501];
int s,d;
int min_cos = MAX;
int c_cos;
int min_dis = MAX;
int c_dis;
vector<int>ans;
vector<int>c_ans;
void dfs(int root)
{
    
    
    visi[root] = 1;
    if(root == d){
    
    
        if(c_dis < min_dis){
    
    
            min_dis = c_dis;
            min_cos = c_cos;
            ans = c_ans;
        }
        else if(c_dis == min_dis && c_cos < min_cos){
    
    
            min_cos = c_cos;
            ans = c_ans;
        }
    }
    else{
    
    
        for(int i = 0;i<n;i++)
            if(!visi[i] && road[root][i]){
    
    
                c_dis += dis[root][i];
                c_cos += cost[root][i];
                c_ans.push_back(i);
                dfs(i);
                c_dis -= dis[root][i];
                c_cos -= cost[root][i];
                c_ans.pop_back();
            }
    }
    visi[root] = 0;
}
int main()
{
    
    
    cin>>n>>m>>s>>d;
    for(int i = 0;i<m;i++)
    {
    
    
        int a,b,x,y;
        cin>>a>>b>>x>>y;
        road[a][b] = road[b][a] = 1;
        dis[a][b] = dis[b][a] = x;
        cost[a][b] = cost[b][a] = y;
    }
    dfs(s);
    cout<<s;
    for(int i = 0;i<ans.size();i++)
        cout<<" "<<ans[i];
        cout<<" "<<min_dis<<" "<<min_cos;
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_43567222/article/details/112866651