PS:中文题太爽了。。
题意:中文题我就不写题意了。。。
分析:我感觉要注意两点。。。1.注意等级限制,我本来以为只有在相邻的两个人物中有等级的限制,其实在你需要交换的所有人都有等级的限制。。。2.建图要建有向图。。不是无向图。。我因为这个哇了半天。。。
具体做法就是,建图,然后枚举dijk
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define inf (0x3f3f3f3f)
const int maxn = 105;
int m, n;
struct Goods
{
int p, l, v;
int num[maxn];
int val[maxn];
}goods[maxn];
int map[maxn][maxn];
int dijk(int x)
{
int i, j;
int level = goods[x].l;
int cost[maxn];
bool vis[maxn];
memset(cost, inf, sizeof(cost));
memset(vis, false, sizeof(vis));
for (i=0; i<=n; i++)
{
if (goods[i].l - level <= m && goods[i].l >= level)
cost[i] = map[0][i];
}
vis[0] = true;
for (i=0; i<n; i++)
{
int min = inf, imin;
for (j=0; j<=n; j++)
{
if (!vis[j] && cost[j] < min)
{
imin = j;
min = cost[j];
}
}
if (min == inf)
break;
vis[imin] = true;
for (j=0; j<=n; j++)
{
if (goods[j].l - level <= m && goods[j].l >= level)
if (cost[j] > cost[imin] + map[imin][j])
cost[j] = cost[imin] + map[imin][j];
}
}
return cost[1];
}
int main()
{
while (scanf("%d %d", &m, &n) != EOF)
{
memset(goods, 0, sizeof(goods));
memset(map, inf, sizeof(map));
int i, j;
for (i=1; i<=n; i++)
{
scanf("%d %d %d", &goods[i].p, &goods[i].l, &goods[i].v);
for (j=0; j<goods[i].v; j++)
{
scanf("%d %d", &goods[i].num[j], &goods[i].val[j]);
}
map[0][i] = goods[i].p;
}
for (i=1; i<=n; i++)
{
for (j=0; j<goods[i].v; j++)
{
if (abs(goods[goods[i].num[j]].l - goods[i].l) <= m)
{
if (map[goods[i].num[j]][i] > goods[i].val[j])
{
map[goods[i].num[j]][i] = goods[i].val[j];
}
}
}
}
int min = inf;
for (i=1; i<=n; i++)
{
int tmp = dijk(i);
if (tmp < min)
min = tmp;
}
printf("%d\n", min);
}
return 0;
}
网上大牛的测试数据:
测试数据1:
1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0
5250
测试数据2:
1 5
10000 3 4
2 3000
3 2000
4 2000
5 9000
8000 2 3
3 5000
4 2000
5 7000
5000 1 0
2000 4 1
5 1900
50 1 0
4000
测试数据3:
3 8
10000 3 6
2 3000
3 2000
4 2000
5 9000
7 1000
8 5008
8000 2 3
3 5000
4 2000
5 7000
5000 1 1
6 1000
2000 4 1
5 1900
50 1 0
5000 1 1
7 4007
2000 4 1
5 1900
80 3 0
2950
测试数据4:
1 10
1324 0 0
1234 0 0
255 0 0
67 0 0
56 0 0
2134 0 0
456 0 0
2345 0 0
67 0 0
6436 0 0
1324
测试数据5:
1 4
10000 3 2
2 1
3 3
1000 2 2
4 1
3 1
1000 3 1
4 2
100 4 0
105
测试数据6:
3 5
10000 3 4
2 3000
3 2000
4 2000
5 9000
8000 2 3
3 5000
4 2000
5 7000
5000 1 0
2000 4 1
5 1900
50 1 0
3950