宝物
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
6
-
描述
-
传说HMH大沙漠中有一个迷宫,里面藏有许多宝物。迷宫里可能有N个藏宝地点,用1到N标记。藏宝地点之间最多有一条通路相连。标记1为迷宫的进出口。
某天,Dr.Kong找到了迷宫的地图,他已经知道其中K(1<=K<=N)个不同的地点真的藏有宝物。Dr.Kong决定让他的机器人卡多去探险。卡多在经过某个藏宝地点时可能会拿走宝物。但它每拿走一个藏宝地点的宝物后,它的载重量就会增加W。迷宫中的通路不是平坦的,到处都是陷阱。假设每条通路都有一个危险度,其值与通过此路的载重量成正比。
当机器人卡多进入迷宫时,它的载重量为0。只有当卡多携带宝物的载重量不大于某个通路的危险度时,它才能顺利通过此条道路,否则就会掉入陷阱,不能出来。
Dr.Kong希望他的机器人卡多尽量多的带出宝物,当然他更希望卡多最后能从标记1的地点走出去。
请你编写程序,帮助Dr.Kong计算一下,卡多最多能带出多少个藏宝地点的宝物。
-
输入
-
有多组测试数据,以EOF为输入结束的标志
第1行: N M K W
接下来有K行, 每行一个整数,表示藏有宝物的地点标号。
再接下来有M行,每行三个整数X,Y,Z,表示地点X与地点Y之间有一条危险度为Z的通路。
1 ≤ N ≤ 8000 1 ≤ K ≤ N 1 ≤ M ≤ 15000 1 ≤ W, Z ≤ 10000
数据保证所有的地点之间都是有道路可以到达的。
提示:机器人卡多经过一个藏宝地点时可以不拿走宝物, 而且同一个藏宝地点可以经过多次。
输出
- 输出有一个整数, 表示卡多最多能带出的宝物的堆数。 样例输入
-
6 7 5 1 1 2 3 4 5 1 2 3 3 6 2 6 2 10 2 4 1 5 1 1 4 5 1 1 6 1
样例输出
-
4
-
有多组测试数据,以EOF为输入结束的标志
给出了每条路和限制条件,那么我们只需要求出源点(即1)到每个宝藏点所经过路径限制的中的最大值,此时这个最大值就是源点到宝藏点最大可以承载多少宝藏经过,然后排序,贪心即可
每次从1先把限制较小的宝藏取走,返回1,以此类推
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int inf=0x3f3f3f3f;
bool book[15555];
int n,m,k,w,tot,first[8005],dis[8005];
struct node
{
int v,w,next;
}e[15555*2];
struct data
{
int num,val;
}num[15555];
void add_edge(int u,int v,int w)
{
e[tot].w=w;
e[tot].v=v;
e[tot].next=first[u];
first[u]=tot++;
}
void spfa()
{
mem(dis,0);
dis[1]=inf;
queue<int>q;
q.push(1);
while(!q.empty())
{
int st=q.front();
q.pop();
for(int i=first[st];~i;i=e[i].next)
{
if(dis[e[i].v]<min(e[i].w,dis[st]))
{
dis[e[i].v]=min(e[i].w,dis[st]);
q.push(e[i].v);
}
}
}
}
bool cmp(data a,data b)
{
return a.val<b.val;
}
int main()
{
while(~scanf("%d%d%d%d",&n,&m,&k,&w))
{
mem(first,-1);
tot=0;
mem(book,0);
int x,y,z;
for(int i=1;i<=k;i++)
scanf("%d",&num[i].num);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
add_edge(y,x,z);
}
spfa();
for(int i=1;i<=k;i++)
num[i].val=dis[num[i].num];
sort(num+1,num+k+1,cmp);
int ans=0,len=0;
for(int i=1;i<=k;i++)
{
if(ans+w<=num[i].val)
ans+=w,len++;
}
printf("%d\n",len);
}
return 0;
}