版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/u013497151/article/details/30299671

题目链接:

id=1062" rel="nofollow">昂贵的聘礼

   这个题对自己收获挺大的。模板要自己常常敲,才干理解。要自己常常敲,从能温故而知新。自己曾经总结的建图方式。做题的时候要会用,要敢用。否则==NULL。

题意对于交换条件描写叙述的有点不清楚,这里解释一下,如果8件物品,等级差距不能超过3。酋长LV 5。所以能够进行交换的LV区间是[2,5][3,6][4,7][5,8]。不必考虑题目那一句。“可是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易。他们觉得这样等于是间接接触,反过来也一样”。

越看越晕。仅仅要符合以上区间的都能够进行交换。

思路:開始看题时。自己的思路有点偏差,觉得P神仅仅能从价格最廉价、等级最低的那个人開始首次交易,后来敲了。。。再后来。。无从下手了,看了一下Discuss,噢。枚举啊。Discuss上的神牛门大多用Dijkstra 或 Bellman-Ford过的,还剪枝...俺还没学啊。然后,我想Bellman-Ford能过的SPFA肯定也能过。可是SPFA怎么敲,忘了。

。又又一次复习最短路 And 建图方式,开敲1遍A。中间的小细节自己处理的不好,还不会调程序。又叫P神过来了。

。。。

ME        TIME

720kb    32ms

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
const int Size = 99999;
const int INF = 1<<20;
const int N = 101;
const int MMM = 10010;
using namespace std;
int NN,M,l = 0;
struct node{
int v,w,next;
}edge[MMM];
int p[N],lv[N],num,t;
int dis[N],vis[N],lim,low;
int q[MMM],head[MMM]; int SPFA(int S,int E)
{
//printf("low = %d high = %d\n",low,lim);
int s = 0,e = 0;
for(int i = 1;i<=N;i++)
dis[i] = p[1];
dis[S] = 0;
q[e++] = S;
vis[S] = 1;
while(s < e)
{
int tmp = q[s++];
for(int i = head[tmp];i!=0;i=edge[i].next)
{
if((lv[edge[i].v]>=low && lv[edge[i].v]<=lim )&& (dis[edge[i].v]> dis[tmp] + edge[i].w))
{
dis[edge[i].v] = dis[tmp] + edge[i].w;
if(!vis[edge[i].v])
{
q[e++] = edge[i].v;
vis[edge[i].v] = 1;
}
}
}
vis[tmp] = 0;
}
return dis[E];
}
void add(int a,int b,int c) //前向星建图
{
edge[t].v = b;
edge[t].w = c;
edge[t].next = head[a];
head[a] = t;
t++;
}
/*void Print()
{
int k,i;
for(i = 0; i <= NN; i++)
{
if(head[i])
{
for(k = head[i]; k != 0; k = edge[k].next)
{
printf("%d->%d %d\n", i, edge[k].v, edge[k].w);
}
}
}
}*/
int main()
{
int a,b;
while(~scanf("%d%d",&M,&NN))
{
l = 0;
t = 1;
memset(head,0,sizeof(head));
for(int i = 1;i<=NN;i++)
{
scanf("%d%d%d",&p[i],&lv[i],&num);
add(0,i,p[i]);
for(int j = 0;j<num;j++)
{
scanf("%d%d",&a,&b);
add(a,i,b);
}
}
/*puts("-------------");
Print(); //打印图形
puts("-------------");*/ int minn = INF,flag = 0;
for(int i = lv[1]-M;i<=lv[1];i++) //枚举全部可行交换
{
lim = i + M;
low = i;
memset(vis,0,sizeof(vis));
flag = SPFA(0,1);
(flag < minn)?(minn = flag):(minn=minn);
}
printf("%d\n",minn);
}
return 0;
}

POJ -1062 昂贵的聘礼(前向星 &amp;&amp; SPFA)的更多相关文章

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

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

  2. POJ 1062 昂贵的聘礼(图论,最短路径)

    POJ 1062 昂贵的聘礼(图论,最短路径) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女 ...

  3. poj 1062 昂贵的聘礼 (dijkstra最短路)

    题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  4. POJ 1062 昂贵的聘礼

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

  5. 最短路POJ 1062 昂贵的聘礼

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

  6. POJ 1062 昂贵的聘礼(带限制条件的dijkstra)

    题目网址:http://poj.org/problem?id=1062 题目: 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

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

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

  8. POJ 1062 昂贵的聘礼(最短路中等题)

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

  9. poj 1062 昂贵的聘礼 (最短路径)

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33365   Accepted: 9500 Descriptio ...

随机推荐

  1. delphi程序热键

    要定义一个全局热键,通常有三个步骤:      1.定义Windows的消息WM_HOTKEY的HOOK链,即            procedure MyShortCut(Var Message: ...

  2. day15<集合框架>

    集合框架(对象数组的概述和使用) 集合框架(集合的由来及集合继承体系图) 集合框架(Collection集合的基本功能测试) 集合框架(集合的遍历之集合转数组遍历) 集合框架(Collection集合 ...

  3. upper()

    upper() 用于把字符串中的小写字母转换成大写字母 In [1]: str = "Hello World" In [2]: str.upper() Out[2]: 'HELLO ...

  4. 如何让IOS中的文本实现3D效果

    本转载至 http://bbs.aliyun.com/read/181991.html?spm=5176.7114037.1996646101.25.p0So7c&pos=9       zh ...

  5. 《C++ Primer Plus》第7章 函数——C++的编程模块 学习笔记

    函数是C++的编程模块.要使用函数,必须提供定义和原型,并调用该函数.函数定义是实现函数功能的代码:函数原型描述了函数的接口:传递给函数的值的书目和种类以及函数的返回类型.函数调用使得程序将参数传递给 ...

  6. poj_2182 线段树/树状数组

    题目大意 n个数排成一排(不知道大小,只是占了一个位置),从a[1]到a[n]进行遍历,对于每个a[i],给出从a[1]到a[i-1]中小于a[i]数的个数.要求出 a[1]到a[n]中这n个数的相对 ...

  7. synchronized同步语句块

    用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个长时间的任务,那么B线程则必须等待比较长时间.在这样的情况下可以使用synchronized同步语句块来解 ...

  8. JS-检测浏览器类型及版本

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Mybatis——SQL语句构建器类

    SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句.这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中.正如你已经看到的 ...

  10. libvirt kvm 虚拟机上网 – Bridge桥接

    版权声明:本文由陈煜东原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/90 来源:腾云阁 https://www.qclou ...