http://codevs.cn/problem/1324/

  • 题目大意

    一个部落,你能够和社会地位等级的极差不大于M的全部人交易。你能够拿金币直接从一个人手里买东西,也能够从别人那里买到那个人想要的东西来获取减价。

    问终于从酋长那里“买”到你心仪的“东西”的最小代价。

  • 题解

    把自己作为起点。向每个物品连边权为这件物品原价的有向边。然后假设买物品i会使物品j降价,那么连一条从i到j边权为降价后的价格的有向边。然后枚举包含了酋长等级的全部等级范围,从自己到酋长的“东西”跑仅仅经过当前等级范围同意的最短路,再取最小值就可以。

    多组数据处理时要把原图清干净。

  • Code

#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 100000, nil = 0, oo = 1000000000;
int M, N, S, T, ans;
int e, nxt[maxn], u[maxn], v[maxn], w[maxn], pnt[150];
int d[150];
bool vis[150];
struct things
{
int n, p, m;
things(int n = 0, int p = 0, int m = 0) :n(n), p(p), m(m) {}
}sth[150];
vector <things> rep[150];
struct node
{
int n, dis;
node(int n = 0, int dis = 0) :n(n), dis(dis) {}
bool operator < (const node& b) const
{
return dis > b.dis;
}
};
void addedge(int a, int b, int c)
{
u[++e] = a; v[e] = b; w[e] = c;
nxt[e] = pnt[a]; pnt[a] = e;
}
void init()
{
int P, L, X, Tt, V;
e = 0; ans = oo;
memset(nxt, 0, sizeof(nxt));
memset(pnt, 0, sizeof(pnt));
memset(u, 0, sizeof(u));
memset(v, 0, sizeof(v));
memset(w, 0, sizeof(w));
for(int i = 0; i < 150; ++i)
{
sth[i] = things();
rep[i].clear();
}
for(int i = 1; i <= N; ++i)
{
scanf("%d%d%d", &P, &L, &X);
sth[i] = things(i, P, L);
for(int j = 1; j <= X; ++j)
{
scanf("%d%d", &Tt, &V);
rep[i].push_back(things(Tt, V));
}
}
S = 0; T = 1;
for(int i = 1; i <= N; ++i)
{
addedge(S, i, sth[i].p);
for(int j = 0; j < rep[i].size(); ++j)
{
addedge(rep[i][j].n, i, rep[i][j].p);
addedge(S, rep[i][j].n, sth[rep[i][j].n].p);
}
}
}
void getSSSP(int minM, int maxM)
{
memset(d, 0x3f, sizeof(d));
memset(vis, 0, sizeof(vis));
priority_queue <node> Q;
d[S] = 0;
Q.push(node(S, 0));
while(!Q.empty())
{
node t = Q.top();
Q.pop();
vis[t.n] = true;
for(int j = pnt[t.n]; j != nil; j = nxt[j])
{
if((!vis[v[j]]) && (sth[v[j]].m >= minM) && (sth[v[j]].m <= maxM) && (d[v[j]] > t.dis + w[j]))
{
d[v[j]] = t.dis + w[j];
Q.push(node(v[j], d[v[j]]));
}
}
}
}
void work()
{
for(int i = sth[T].m - M; i <= sth[T].m; ++i)
{
getSSSP(i, i + M);
ans = min(ans, d[T]);
}
printf("%d\n", ans);
}
int main()
{
while(scanf("%d%d", &M, &N) == 2)
{
init();
work();
}
return 0;
}
  • 总结

    题见得多了,建图的感觉自然就有了。

ZJOI2002昂贵的聘礼题解的更多相关文章

  1. ZJOI2002 昂贵的聘礼

    题目描述 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请 ...

  2. POJ 1062 昂贵的聘礼 (最短路)

    昂贵的聘礼 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/M Description 年轻的探险家来到了一个印第安部落里.在那里 ...

  3. POJ1062:昂贵的聘礼(dfs)

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 58108   Accepted: 17536 题目链接:http ...

  4. POJ1062昂贵的聘礼[最短路建模]

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45892   Accepted: 13614 Descripti ...

  5. 昂贵的聘礼(dijkstra)

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38549   Accepted: 11158 Descripti ...

  6. POJ 1062 昂贵的聘礼

    C - 昂贵的聘礼 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit St ...

  7. 最短路(Dijkstra) POJ 1062 昂贵的聘礼

    题目传送门 /* 最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路 更新每个点的最短路的最小值 注意:国王的等级不一定是最高的:) */ #i ...

  8. Poj OpenJudge 百练 1062 昂贵的聘礼

    1.Link: http://poj.org/problem?id=1062 http://bailian.openjudge.cn/practice/1062/ 2.Content: 昂贵的聘礼 T ...

  9. POJ1062昂贵的聘礼(dijkstra)

    昂贵的聘礼 题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1 由于有N个物 ...

随机推荐

  1. HDU 5281 Senior&#39;s Gun 杀怪

    题意:给出n把枪和m个怪.每把枪有一个攻击力,每一个怪有一个防御力.假设某把枪的攻击力不小于某个怪的防御力则能将怪秒杀,否则无法杀死.一把枪最多仅仅能杀一个怪,不能用多把枪杀同一个怪.每杀一次怪能够得 ...

  2. php安装zendDebug

    这次一定要写.这个zendDebug安装说不麻烦也简单,可是我却安装了非常久,就是自己粗心的问题.这个一定要解决呀. 言归正传,首先.去官网上下载zendDebug的安装文件.下载地址.TMD这个地址 ...

  3. vim 计算器寄存器使用

    我们可能会在vim的使用中,碰到下面的情况 当我正在写一周预算的时候,我想计算下每天我买菜花2.7,每天买两顿,周死晚上出去吃,周六额外买1.5斤14.8一斤的猪肉... 这时候你打算怎么办呢,是不是 ...

  4. js---跨域的问题

    一:跨域一般的报错情况  一般来说,如果你在开发中需要进行跨域操作(从一个非同源网站发送请求获取数据),一般而言,你在浏览器控制台看到的结果为: 二:同源策略 说到跨域就不得不提“同源策略”. 那么, ...

  5. Kinect 开发 —— Kinect Interaction 交互控件

    Kinect Interactions 提供了一些新的带有姿势识别的控件如 push-to-press 按钮, grip-to-pan 列表控件, 而且支持多用户,同时二个人进行的交互,这些新添加的控 ...

  6. Checkpoint & cache & persist

    checkpoint checkpoint(检查点)是Spark为了避免长链路,大计算量的Rdd不可用时,需要长时间恢复而引入的.主要就是将通过大量计算而获得的这类Rdd的数据直接持久化到外部可靠的存 ...

  7. HUD——T 3836 Equivalent Sets

    http://acm.hdu.edu.cn/showproblem.php?pid=3836 Time Limit: 12000/4000 MS (Java/Others)    Memory Lim ...

  8. C# wpf程序获取当前程序版本

    C# wpf程序获取当前程序版本 /// <summary>         /// 获取当前系统的版本         /// </summary>         /// ...

  9. R语言-上海二手房数据分析

    案例:通过分析上海的二手房的数据,分析出性价比(地段,价格,未来的升值空间)来判断哪个区位的二手房性价比最高 1.载入包 library(ggplot2) library(Hmisc) library ...

  10. C#中选中指定文件并读取类似ini文件的内容

    一.背景 由于项目中需要去读取设备的配置信息,配置文件的内容和INI配置文件的格式类似,所以可以按照INI文件的方式来处理.涉及如何打开一个文件,获取打开的文件的路径问题,并读取选中的文件里边的内容. ...