牛客网 MIKU酱的氪金宝典(BFS)

题目传送门

MIKU酱的氪金宝典

题目描述

MIKU酱是个玩游戏氪金的人,游戏公司给她制定了新的规则,如果想从关卡i到关卡j,你需要交一些钱就可以了,但同时,MIKU酱的爸爸zjw很爱她,所以她可以每过一关就向她爸要一次钱,但她爸每次给他的钱是固定的,MIKU酱是个不会节省的女孩,哪怕每次多出来的钱,她也会拿去买肥宅快乐水,所以每次要的钱一定花完,因为MIKU酱不想挨骂,所以希望每次他爸给她的钱最少。

tips(到达第n关即通过,每到达一关一定能通过这关)

输入描述:

多组输入,每个样例第一行输入两个整数n,m(2<=n<=200,1<=m<=1000)表示关卡和规则的数量,接下来m行规则,每行输入x,y,w(w<=1000),表示从关卡x到y需要缴纳w的费用,保证题目有解,不会出现x=y的情况

输出描述:

输出一行,代表最少的钱

示例1
4 4
1 2 2
1 3 1
2 4 3
3 4 1
输出
1
思路

这是一个变相的最短路,没用Dijkstra(不太会),用了最常用的BFS。

从1开始BFS,每次搜完之后都要把边删掉防止死循环,终点为N就更新答案为最小值。

注意剪枝,虽说这题水了点不剪枝也能过。

补题反思:一定要细心细心再细心,当时没用注意有重边!!!也没用注意边是有向边!!!

代码
#include <bits/stdc++.h>
using namespace std;
#define MAXN 250
#define INF 0x3f3f3f3f
int maps[MAXN][MAXN];
int ans;
int n;
struct node{
    int id,cost;
};
bool operator < (node a,node b){
    return a.cost>b.cost;
}
priority_queue<node>taylor;
void init(){
    memset(maps,INF,sizeof (maps));
    while (!taylor.empty()){
        taylor.pop();
    }
    ans=INF;
}
void bfs(){
    taylor.push(node{1,0});
    while (!taylor.empty()){
        node t=taylor.top();
        taylor.pop();
        if (t.id==n){
            ans=min(ans,t.cost);
        }
        if (t.cost>ans){
            return;
        }
        for (int i=1;i<=n;i++){
            if (maps[t.id][i]!=INF){
                taylor.push(node{i,max(t.cost,maps[t.id][i])});
                maps[t.id][i]=INF;
            }
        }
    }
}
int main (){
    int m;
    while (scanf("%d%d",&n,&m)!=EOF){
        init();
        for (int i=0;i<m;i++){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            maps[u][v]=min(maps[u][v],w);
//            maps[u][v]=maps[v][u];
        }
        bfs();
        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值