poj 1062 昂贵的聘礼 最短路bellman

2023-12-08 10:32

本文主要是介绍poj 1062 昂贵的聘礼 最短路bellman,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

假设等级差距为1,货物1等级为1,货物2等级为2,货物等级3为3,若1先与2交易,则2无法与3交易,因为1与3相差2>1.

故使        每次使   pp[edge[j].v].minn=max(pp[edge[j].v].minn,pp[edge[j].u].minn);
                               pp[edge[j].v].maxx=min(pp[edge[j].v].maxx,pp[edge[j].u].maxx);

首先题目是有向图,没负权回路就没问题,很多人没看清题,discuss里题目争议很大,边权题意已经规定为正值,故不会形成负权回路。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int INF=0x1f1f1f;
int m,n;
struct Str
{int u;int v;int w;
};
Str edge[11000];
int len;
int res[110];
struct Point
{int p,l;int minn,maxx;
};
Point pp[110];
void bellman()
{memset(res,INF,sizeof(res));res[1]=0;for(int i=1;i<=n;i++){pp[i].minn=pp[i].l-m;pp[i].maxx=pp[i].l+m;}for(int i=0;i<n;i++){for(int j=0;j<len;j++){if(res[edge[j].v]>res[edge[j].u]+edge[j].w&&pp[edge[j].v].l>=pp[edge[j].u].minn&&pp[edge[j].v].l<=pp[edge[j].u].maxx){pp[edge[j].v].minn=max(pp[edge[j].v].minn,pp[edge[j].u].minn);pp[edge[j].v].maxx=min(pp[edge[j].v].maxx,pp[edge[j].u].maxx);res[edge[j].v]=res[edge[j].u]+edge[j].w;}}}
}
int main()
{while(scanf("%d%d",&m,&n)!=EOF){len=0;int p,l,x;for(int i=0;i<n;i++){scanf("%d%d%d",&p,&l,&x);pp[i+1].p=p;pp[i+1].l=l;int t,v;for(int j=0;j<x;j++){scanf("%d%d",&t,&v);edge[len].u=i+1;edge[len].v=t;edge[len++].w=v;}}bellman();int num=INF;for(int i=1;i<=n;i++){num=min(num,pp[i].p+res[i]);}cout<<num<<endl;}return 0;
}
/*
1 3
100 1 1
2 20
70 2 1
3 20
20 3 0
*/

这篇关于poj 1062 昂贵的聘礼 最短路bellman的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/469528

相关文章

poj 3882(Stammering Aliens) 后缀数组 或者 hash

后缀数组:  构建后缀数组,注意要在字符串莫末尾加上一个没出现过的字符。然后可以2分或者直接扫描,直接扫描需要用单调队列来维护 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string

poj 3294(Life Forms) 2分+ 后缀数组

我曾用字符串hash写,但是超时了。只能用后最数组了。大致思路:用不同的符号吧字符串连接起来,构建后缀数组,然后2分答案,依次扫描后缀数组,看是否瞒住条件。 VIEW CODE #include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<cstring>#include<cassert>#

poj 2391 Ombrophobic Bovines (网络流)

这是一道很经典的网络流的题目。首先我们考虑假如我们的时间为无穷大。我们吧每个点拆成2个点 i和i' .。虚拟源点s和汇点t。对于每个点建边(s,i, a[i])  (i‘,t,ib[i]) 。 其中a[i]为给点有多少牛,b[i]为容量。i和j连通 建边 (i,j',inf);如果最大流==所有牛的个数,就可能装下所有的牛。那么现在我们考虑时间。假设最大时间为T.那么如果i到j的的最短时间>T

poj 1330 LCA 最近公共祖先

水题目。直接上代码了。 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<map>#include<vector>#

poj 3160 Father Christmas flymouse 强连通+dp

首先我们可以确定的是,对于val值小于0的节点都变成0.   假设一个集合内2个房间都能任意到达,那么我就可以吧集合内的所有点的价值都取到,并且可以达到任一点。实际上集合内的每个点是相同的,这样的集合就是一个强连通分量。 那么我们就可以用tarjin算法进行强连通缩点, 最后形成一个dag的图。在dag的图上面进行dp。可以先用拓扑排序后dp。或者建反响边记忆化搜索 。 VIEW

BFS:解决多源最短路问题

文章目录 什么是多源最短路问题?1.矩阵2.飞地的数量3.地图的最高点4.地图分析总结 什么是多源最短路问题? 多源最短路问题(Multi-Source Shortest Path Problem,MSSP)是图论中的一个经典问题,它的目标是在给定图中找到从多个源点到所有其他顶点的最短路径。这个问题可以视为单源最短路问题(Single-Source Shortest Pa

poj 1564 Sum It Up -- DFS 递归

题意:给一个数 t ,以及 n 个数,求 n 个数中的几个数加起来的和为 t 的情况有多少种。 注意:题目要求相同的组合方式不能出现2次,即 “3 4 1 1 1 1 ” 的结果为:“1+1+1”。 思路:一个  for  循环遍历一遍,每个 i 表示以当前数为起点开始一次DFS递归,当所遍历的和为 t 时,输出该组合方式,如果大于 t 则返回,小于则往下递归。以二维数组保存已经输出过的数据,

最短路算法总结(dijkstra,flyod,bellmanford,spfa)

总结 d i j k s t r a dijkstra dijkstra h e a p − d i j k s t r a heap-dijkstra heap−dijkstra b e l l m a n f o r d bellmanford bellmanford s p f a spfa spfa f l o y d floyd floyd最短路类型单源单源单源单源全源数据维护 e

道路 Road(百练,POJ)

题目链接: 1724 -- ROADS (poj.org) 题目描述: 思路: 这题目乍一看,是一个含有2个标尺的单源最短路问题,挺难处理的。 既然没法直接用最短路处理,那我们就“记录信息”,将花费的时间也记录进dp数组,然后跑“状态最短路”。 用f[i][j] 表示到达点i 且 总花费时间为j的最短距离,然后跑堆优化的dijkstra算法就好。由于不含有负边权,因此可以搞一个vis数

BFS 解决最短路问题

例题一 解法(bfs 求最短路): 算法思路: 利⽤层序遍历来解决迷宫问题,是最经典的做法。我们可以从起点开始层序遍历,并且在遍历的过程中记录当前遍历的层数。这样就能在找到出⼝的时候,得到起点到出⼝的最短距离。 例题二 解法: 算法思路: 如果将「每次字符串的变换」抽象成图中的「两个顶点和⼀条边」的话,问题就变成了「边权为