PAT甲级-1030 Travel Plan (30分)

题目:1030 Travel Plan (30分)
分析:单纯的DFS,记录路径,最短dis和最小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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值