题意
本题是汉语题目,就不再具体讲解题目了,挺好理解的。
题解
思路
本题使用DFS就可以了,但是需要注意的是环的判断,否则会MLE。不过离谱的是酋长竟然不是部落里地位最高的人。
代码
#include <stdio.h>
#include <memory>
int map[105][105];
int n;
int level[105];
int way[105][105]; //way[i][j] 是 i商品 = j商品 + way[i][j]
bool vis[105][105];
int lim;
int cost[105];
int max(int a , int b){
if(a > b)
return a;
else
return b;
}
int min(int a , int b){
if(a < b)
return a;
else
return b;
}
int dfs( int number , int maxl , int minl ){
int mincost = cost[number];
//printf("in number %d\n" , number);
for(int i = 1 ; i <= map[number][0] ; i++){
int j = map[number][i];
//printf("maxl is %d , minl is %d , this l is %d\n" , maxl , minl , level[j]);
if(level[j] <= maxl && level[j] >= minl && !vis[number][j]){
//printf("we need try %d\n",j);
vis[number][j] = 1;
int ncost = way[number][j] + dfs(j , min(maxl , level[j]+lim) , max(minl , level[j] - lim));
//printf("nunber is %d , j is %d , way is %d , mincost is %d and ncost is %d\n",number,j,way[number][j],mincost , ncost );
mincost = min(mincost , ncost);
vis[number][j] = 0;
}
}
return mincost;
}
int main(){
scanf("%d%d",&lim,&n);
int p , l , x;
int t , v;
for(int i = 1 ; i <= n ; i++){
scanf("%d%d%d",&p,&l,&x);
cost[i] = p;
level[i] = l;
map[i][0] = x;
for(int j = 1 ; j <= x ; j++){
scanf("%d%d",&t,&v);
map[i][j] = t;
way[i][t] = v;
}
}
memset(vis , 0 , sizeof(vis));
//for( int i = 1 ; i <= n ; i++ ){
// for( int j = 1 ; j <= map[i][0] ; j++ ){
// printf("%d to %d need %d , and level is %d\n" , i , map[i][j] , way[i][map[i][j]] , level[map[i][j]]);
// }
//}
printf("%d\n",dfs(1,level[1]+lim,level[1]-lim));
}
本文介绍了一道编程题目,通过深度优先搜索(DFS)算法来寻找在一个商品交易网络中,从起点到终点经过指定级别的路径,且路径成本最小的方法。题目中需要注意环的判断以避免无穷循环,并在代码中给出了详细实现。
6801

被折叠的 条评论
为什么被折叠?



