算法分析
通过题目描述可知,若某个东西想得到,要么通过对换,要么直接购买,例如
要得到酋长的女儿:
-
1、10000个金币
-
2、8000个金币 + 皮袄
-
3、5000个金币 + 水晶球
建图
-
1、虚拟结点
S
可以和酋长的女儿连上一条权值是10000的边 -
2、皮袄可以和酋长的女儿连上一条权值是8000的边
-
3、水晶球可以和酋长的女儿连上一条权值是5000的边
注意:由于题目要求如果两人地位等级差距超过了M
,就不能”间接交易”。
表示在整条路线任意两个点的等级差距不能超过M
,划定长度为M
的区间且1
号点在区间内,等级必须在[left,right]
中才可走,在图中跑M + 1
次Dijkstra
算法
时间复杂度 $O(n^2 * m)$
参考文献
算法提高课
Java 代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class Main{
static int N = 110;
static int INF = 0x3f3f3f3f;
static int n;
static int m;
static int[][] w = new int[N][N];
static int[] level = new int[N];
static int[] dist = new int[N];
static boolean[] st = new boolean[N];
//等级必须在[left,right]中才可走
static int dijkstra(int left,int right)
{
Arrays.fill(st, false);
Arrays.fill(dist, INF);
dist[0] = 0;
for(int i = 0;i < n;i ++)
{
int t = -1;
for(int j = 0;j <= n;j ++)
{
if(!st[j] && (t == -1 || dist[j] < dist[t]))
t = j;
}
st[t] = true;
for(int j = 1;j <= n;j ++)
{
//等级在指定范围
if(level[j] >= left && level[j] <= right)
dist[j] = Math.min(dist[j],dist[t] + w[t][j]);
}
}
return dist[1];
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s1 = br.readLine().split(" ");
m = Integer.parseInt(s1[0]);
n = Integer.parseInt(s1[1]);
for(int i = 0;i <= n;i ++) Arrays.fill(w[i], INF);
for(int i = 1;i <= n;i ++)
{
String[] s2 = br.readLine().split(" ");
int price = Integer.parseInt(s2[0]); // 价格
level[i] = Integer.parseInt(s2[1]);
int cnt = Integer.parseInt(s2[2]); // 可以替换的数量
w[0][i] = Math.min(w[0][i], price);
while(cnt -- > 0)
{
String[] s3 = br.readLine().split(" ");
int a = Integer.parseInt(s3[0]);
int cost = Integer.parseInt(s3[1]);
w[a][i] = Math.min(w[a][i], cost);
}
}
int res = INF;
for(int i = level[1] - m;i <= level[1];i ++) res = Math.min(res, dijkstra(i,i + m));
System.out.println(res);
}
}
呆神又提供了一个好图,谢谢佬
感觉y总的做法好像做麻烦了,我写了一个只用跑一次Dijkstra的做法,不知道是不是我哪里搞错了https://www.acwing.com/solution/content/41411/
赞,呆神是唯一一个讲清楚等级制度的
搬砖的hh