Description
Input
Output
Sample Input
1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0
Sample Output
5250
解题思路:
这题其实仍然是最短路问题,就是一件商品如果用另外的商品来换可以降低价格。也就是先买下一件商品,然后贴些钱去换别的商品,再拿这个换回的商品去换下一件,直到最后换回自己想要的商品,求一共花多少钱。这样就转化成了求一件商品到想要的商品间的最短路。唯一难点是题目还有一个限制,两个商人等级差超出了m就不能进行交换。由于第一件商品就是我们最终要的,所以我们可以限定所有交易的商人等级范围,设第一个商人为D级,等级差不超过m,则所有交易的商人等级都在[D - m, D +m]。但这只是初步限定范围。我们不可能让等级为D-m和D+m的商人交易,所以继续缩小范围,所有商人的等级差都不能超过m,只有这么几种范围[D -m, D] ,[D - m + 1, D + 1] ......[D, D + m]。把所有情况中的最小花费求出来,再找出其中最小的即可。说归说,代码还是写得很挫。。。。。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std; const int maxn = 105, INF = 9999999; int m, n, map[maxn][maxn], dist[maxn], degree[maxn]; bool visited[maxn], limit[maxn]; // limit用于限定等级 int Dijkstra(int a) { int pos = a, min; for(int i = 1; i <= n; i++) { dist[i] = map[a][i]; visited[i] = 0; } visited[a] = 1; for(int i = 1; i < n; i++) { min = INF; for(int j = 1; j <= n; j++) if((!visited[j]) && !limit[j] && dist[j] < min) // 还需要满足等级限制 { pos = j; min = dist[pos]; } if(min == INF) break; visited[pos] = 1; for(int j = 1; j <= n; j++) if(!visited[j] && !limit[j] && dist[pos] + map[pos][j] < dist[j]) dist[j] = dist[pos] + map[pos][j]; } if(a != 1) return dist[1] + map[a][a]; // 不要漏了加上起始商品自身的价值 else return dist[1]; } int main() { int cost, id, num, mincost = INF; scanf("%d%d", &m, &n); for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) map[i][j] = INF; for(int i = 1; i <= n; i++) { scanf("%d%d%d", &cost, degree[i], &num); map[i][i] = cost; // 记录自身的价值 while(num--) { scanf("%d%d", &id, &cost); map[id][i] = cost; // 记录拿商品id换商品i所需要的花费 } } for(int i = 0; i <= m; i++) { memset(limit, 0, sizeof(limit)); for(int j = 1; j <= n; j++) if(degree[j] - degree[1] > m - i || degree[j] < degree[1] - i) limit[j] = 1; // 凡事没达到等级标准的都赋为1 for(int j = n; j >= 1; j--) { int temp = INF; if(!limit[j]) // 只要满足等级限制才进行搜索 temp = Dijkstra(j); if(temp < mincost) // 找出最小的花费 mincost = temp; } } printf("%d\n", mincost); return 0; }
原文地址:http://blog.csdn.net/userluoxuan/article/details/38276597