题目传送门
题目描述
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;
}