HDU 4396 More lumber is required(最短路)

题意:每走一段路可以获得10根木头,问从S到T至少要获得K根木头,,,问要需要走多少路程,。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>

using namespace std;
const int N = 5009;
const int M = 200009;
const int INF = 0x3f3f3f3f;
int n,m;
int S,T,K;
struct LT{
    int nex,to,dis;
} L[M];
int F[N],cnt;
void add(int f,int t,int d)
{
    L[cnt].dis = d;
    L[cnt].nex = F[f];
    L[cnt].to = t;
    F[f] =cnt++;
}
int dis[N][59];
void init()
{
    memset(F,0,sizeof(F));cnt =1;
    int f,t,d;
    for(int i=0;i<m;i++)
    scanf("%d%d%d",&f,&t,&d),add(f,t,d),add(t,f,d);
    scanf("%d%d%d",&S,&T,&K);
    K = (K+9)/10;
}
struct node{
    int v,h,dis;
    bool operator<(const node t) const
    {
        return dis>t.dis;
    }
};
priority_queue<node> que;
bool visit[N][59];
void solve()
{
    while(!que.empty()) que.pop();
    node e,t;
    memset(dis,INF,sizeof(dis));
    memset(visit,false,sizeof(visit));
    e.dis = 0,e.h=0,e.v=S;
    que.push(e);
    dis[S][0] = 0;
    while(!que.empty())
    {
        e =que.top();que.pop();
        //cout<<e.v<<" "<<e.h<<"  "<<e.dis<<endl;
        if(e.v==T&&e.h>=K)
        {
            printf("%d\n",e.dis);
            return ;
        }
        if(e.h>55||visit[e.v][e.h]) continue;
        visit[e.v][e.h] = true;
        for(int i=F[e.v];i;i=L[i].nex)
        {
            int  to = L[i].to;
            if(dis[to][e.h+1]>e.dis+L[i].dis)
            {
                t.dis=e.dis+L[i].dis;
                dis[to][e.h+1]=t.dis;
                t.h = e.h+1;
                t.v=to;
                que.push(t);
            }
        }
    }
    printf("-1\n");
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&n,&m))
    {
        //cout<<n<<" - "<<m<<endl;
        init();
        solve();
        //cout<<"Solve"<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值