c++解决:“道路”【oj平台等皆使用】

输入描述

第一行包含一个整数K, 0 <= K <= 10000, 代表Bob能够在他路上花费的最大的金币数。第二行包含整数N, 2 <= N <= 100, 指城市的数目。第三行包含整数R, 1 <= R <= 10000, 指路的数目. 接下来的R行,每行具体指定几个整数S, D, L 和 T来说明关于道路的一些情况,这些整数之间通过空格间隔: S is 道路起始城市, 1 <= S <= N D is 道路终点城市, 1 <= D <= N L is 道路长度, 1 <= L <= 100 T is 通行费 (以金币数量形式度量), 0 <= T <=100 注意不同的道路可能有相同的起点和终点。

输出描述

输入结果应该只包括一行,即从城市1到城市N所需要的最小的路径长度(花费不能超过K个金币)。如果这样的路径不存在,结果应该输出-1。

用例输入 1 

5
6
7
1 2 2 3
2 4 3 3
3 4 2 4
1 3 4 1
4 6 2 1
3 5 2 0
5 4 3 2

用例输出 1 

11

老规矩直接上代码

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
using namespace std;
struct edge
{
    int s,t,w,c,n;
}E[10005];
int Next[105];
int dp[10005][105];
void dfs(int c,int cur)
{
    if(dp[c][cur]!=-1)return;
    dp[c][cur]=0x7fffffff/2;
    for(int i=Next[cur];i!=-1;i=E[i].n)
    {
        if(c<E[i].c)continue;
        dfs(c-E[i].c,E[i].s);
        if(dp[c][cur]>dp[c-E[i].c][E[i].s]+E[i].w)
            dp[c][cur]=dp[c-E[i].c][E[i].s]+E[i].w;
    }
}
int main()
{
    int Cost,n,m;
    memset(Next,0xff,sizeof(Next));
    memset(dp,0xff,sizeof(dp));
    cin>>Cost>>n>>m;
    for(int i=0;i<m;++i)
    {
        cin>>E[i].s>>E[i].t>>E[i].w>>E[i].c;
        E[i].n=Next[E[i].t];
        Next[E[i].t]=i;
    }
    for(int i=0;i<=Cost;++i)
        dp[i][1]=0;
    int ans=0x7fffffff/2;
    for(int i=0;i<=Cost;++i)
    {
        dfs(i,n);
        if(dp[i][n]<ans)
            ans=dp[i][n];
    } 
    if(ans==0x7fffffff/2) cout<<"-1"<<endl;
    else cout<<ans<<endl;
    return 0;
}

另:

各位别不相信我只有12岁【捂脸】

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值