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