题目描述

有一天,小米找到了一个藏宝的迷宫地图,迷宫在一个沙漠里有,迷宫里面有许多宝藏。迷宫里可能有N个藏宝地点,用1到K标记。藏宝地点之间最多有一条通路相连。标记1为迷宫的进出口。

他已经知道其中K(1<=K<=N)个不同的地点真的藏有宝物。小米决定让他的机器人米多奇去探险。迷宫中的通路不是平坦的,到处都是陷阱。假设每条通路都有一个危险度,其值与通过此路的载重量成正比。米多奇在经过某个藏宝地点时可能会拿走宝物。但它每拿走一个藏宝地点的宝物后,它的载重量就会增加w。

当机器人米多奇进入迷宫时,它的载重量为0。只有当米多奇携带宝物的载重量不大于某个通路的危险度时,它才能顺利通过此条道路,否则就会掉入陷阱,不能出来。

小米希望他的机器人米多奇尽量多的带出宝物,当然他更希望米多奇最后能从标记为1的地点走出去。

米多奇最多能带出多少个藏宝地点的宝物。

输入

第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

数据保证所有的地点之间都是有道路可以到达的。

提示:机器人米多奇经过一个藏宝地点时可以不拿走宝物, 而且同一个藏宝地点可以经过多次。

数据有多组,处理到文件结束

输出

米多奇可以带走的最大宝物数量

样例输入

5 4 3 1
2
3
4
1 2 3
2 4 2
1 4 3
3 5 6

样例输出

2

不懂可以找东东学长
 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <vector>
#define Max_V 8100
#define inf 0x3f3f3f3f
using namespace std;
int n,m,k,w;
struct Edge{
int x,y,z;
};
vector<Edge> g;
bool have[Max_V];
int maxPass[Max_V];
int ik[Max_V];
int p[Max_V];
int findMax(int a,int b)
{
return a>b?a:b;
}
int findMin(int a,int b)
{
return a>b?b:a;
}
void init()
{
g.clear();
memset(have,,sizeof(have));
}
void add_edge(int x,int y,int z)
{
g.push_back((Edge){x,y,z});
g.push_back((Edge){y,x,z});
}
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int find_way()
{
memset(maxPass,,sizeof(maxPass));
maxPass[]=inf;
bool flag=true;
int u,v,z;
while(flag)
{
flag=false;
for(int i=;i<g.size();i++)
{
u=g[i].x;v=g[i].y;z=g[i].z;
int t=maxPass[v];
maxPass[v]=findMax(maxPass[v],findMin(maxPass[u],z));
if (maxPass[v]!=t)
flag=true;
}
}
int count=;
for(int j=;j<=n;j++)
if(have[j]&&maxPass[j]>=w)
ik[count++]=maxPass[j];
return count;
}
int solve()
{
int mk=find_way();
p[]=;
qsort(ik,mk,sizeof(int),cmp);
for(int i=;i<mk;i++)
{
if(ik[i]>=p[i-]*w+w)
p[i]=p[i-]+;
else p[i]=p[i-];
}
return p[mk-];
}
int main()
{
int i;
while(~scanf("%d%d%d%d",&n,&m,&k,&w))
{
init();
int loc;
for(i=;i<k;i++)
{
scanf("%d",&loc);
have[loc]=;
}
int x,y,z;
for(i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
}
printf("%d\n",solve());
}
return ;
}

NYNU_省赛选拔题(6)的更多相关文章

  1. NYNU_省赛选拔题(10)

    题目描述 Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recog ...

  2. NYNU_省赛选拔题(8)

    题目描述 一天萌萌哒孟孟学长去博物馆参观,他想看到更多的东西.博物馆可以表示为N × M细胞的一个矩形区域. “.”表示为路,“*”表示为墙壁,每个墙壁上面都挂有美丽的画卷.孟孟学长可以看到与他所在位 ...

  3. NYNU_省赛选拔题(7)

    题目描述 In computer science, a binary tree is a tree data structure in which each node has at most two ...

  4. NYNU_省赛选拔题(5)

    题目描述 P 的一家要出去旅游,买了当地的地图,发现各地分别由各个景点,若 P 想使家人分队去景点,尽快到达各个景点(必须所有景点),并且最终所有家人都到达 M 所在的景点.   你用程序告诉 P 最 ...

  5. NYNU_省赛选拔题(3)

    题目描述 二叉树,若其与自己的镜像完全相同,就称其为镜像树. 是一棵镜像树:而 不是镜像树.现给你一棵二叉树,请你判断其是不是镜像树. 输入 第一行是一个整数数T,表示测试数据有多少组每组数据第一行是 ...

  6. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

  7. 2017年第六届数学中国数学建模国际赛(小美赛)C题解题思路

    这篇文章主要是介绍下C题的解题思路,首先我们对这道C题进行一个整体的概括,结构如下: C题:经济类 第一问:发现危险人群. 发现:欺诈的方式开始.雇佣或浪漫的承诺. 数据→确定特定的经济萧条地区→确定 ...

  8. 2013年山东省赛F题 Mountain Subsequences

    2013年山东省赛F题 Mountain Subsequences先说n^2做法,从第1个,(假设当前是第i个)到第i-1个位置上哪些比第i位的小,那也就意味着a[i]可以接在它后面,f1[i]表示从 ...

  9. 2013年省赛H题

    2013年省赛H题你不能每次都快速幂算A^x,优化就是预处理,把10^9预处理成10^5和10^4.想法真的是非常巧妙啊N=100000构造两个数组,f1[N],间隔为Af2[1e4]间隔为A^N,中 ...

随机推荐

  1. ODAC配置

    1.安装Oracle11g服务端 2.安装ODAC                   ODTwithODAC121012 3.拷贝Oracle11g服务端:  F:\app\adccTest\pro ...

  2. 检验身份证的正确性(C语言版本)

    /* check id_card * write by sndnvaps<sndnvaps@gmail.com> * ai -> a1 , a2, a3, a4, a5, a6... ...

  3. rsync+inotify 实现资源服务器的同步目录下的文件变化时,备份服务器的同步目录更新,以资源服务器为准,去同步其他客户端

    测试环境: 资源服务器(主服务器):192.168.200.95 备份服务器(客户端):192.168.200.89 同步目录:/etc/test 同步时使用的用户名hadoop密码12345 实验目 ...

  4. Gradle cookbook(转)

    build.gradle apply plugin:"java" [compileJava,compileTestJava,javadoc]*.options*.encoding ...

  5. CSU 1659: Graph Center(SPFA)

    1659: Graph Center Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 63  Solved: 25 [id=1659"> ...

  6. [WPF]静态资源(StaticResource)和动态资源(DynamicResource)

    一.文章概述 本演示介绍WPF基本采用静态和动态的资源.而且两者都做一个简单的比较. 静态资源(StaticResource)指的是在程序加载内存时对资源的一次性使用,之后就不再訪问这个资源了:动态资 ...

  7. android看不见main函数怎么办?程序异常了,能够不提示“xxx软件停止执行”吗?

    今天遇到了这个问题,分享一下解决方式. android没有main 函数,自然也就不存在main里面加入异常处理来实现全局异常捕获的方案.那android程序有全局异常补货的解决方式吗? 答案是有的: ...

  8. 使用android SpannableStringBuilder实现图文混排,看到许多其他

    项目开发需要达到这种效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmFuY3lsb3ZlamF2YQ==/font/5a6L5L2T/fontsiz ...

  9. Directx11学习笔记【十】 画一个简单的三角形

    本篇笔记要实现的是在屏幕上渲染出一个三角形,重点要学习的是渲染一个几何体的流程方式. 为了渲染几何图形,需要一个顶点缓存和一个描述顶点布局的输入层,还有着色器(主要是顶点着色器和像素着色器),下面来看 ...

  10. Restify —— 在Node.js中构建正确的REST Web服务

    http://restify.com/ https://segmentfault.com/a/1190000000369308 https://cnodejs.org/topic/516774906d ...