HDU 4479 权递增的最短路问题
题目大意:
找一条节点 1 到节点 N 的最短路,保证这条路上每一条边都比前一条边长
dp[i] 表示在当前状态下1到i的最小值
先将所有边根据边的长度排一个序,再每次取出同一段相同长度的边去更新当前图中的每一个点可以更新的dp值,当然我们不能不能因为这相同的边长相互影响,所以不能边找边的同时边松弛dp值,因为可能 1-2:1 2-3:1,也就是说第一次其实不能由1到3这个点,但是你先更新1-2,那么2-3会因为2的dp值存在而可以松弛,所以,先找到所有可行的能进行迟缓的边记录在rec[]数组中,再把里面所有的边弛缓一遍
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = ;
typedef long long LL;
LL dp[N];
int n , m , k; struct Path{
int x,y,d;
bool operator<(const Path &m)const{
return d < m.d;
}
}p[]; struct Rec{
int x,y;
LL d;
Rec(int x=,int y=,LL d=):x(x),y(y),d(d){}
}rec[]; void update(int l , int r)
{
int t = ; for(int i=l;i<=r;i++){
int u = p[i].x , v = p[i].y;
if(dp[u] >= && (dp[v] > dp[u] + p[i].d || dp[v] < ))
{
rec[t++] = Rec(u,v, dp[u] + p[i].d);
}
if(dp[v] >= && (dp[u] > dp[v] + p[i].d || dp[u] < ))
{
rec[t++] = Rec(v,u, dp[v] + p[i].d);
}
} for(int i=;i<t;i++){
int u = rec[i].x , v = rec[i].y;
if(dp[v] > rec[i].d || dp[v] < )
{
dp[v] = rec[i].d;
}
}
} void add_edge(int x,int y,int d)
{
p[k].x = x , p[k].y = y , p[k++].d = d;
} void solve()
{
sort(p,p+k);
memset(dp,-,sizeof(dp));
dp[] = ;
int l=;
for(int r= ; r<k;r++){
if(p[r].d != p[r-].d){
update(l , r-);
l=r;
}
}
update(l,k-);
if(dp[n] < )
puts("No answer");
else
printf("%I64d\n",dp[n]);
} int main()
{
// freopen("test.in","rb",stdin); int T,a,b,d;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m); k=;
memset(G , - , sizeof(G));
for(int i=;i<m;i++){
scanf("%d%d%d",&a,&b,&d);
add_edge(a,b,d);
}
solve();
}
return ;
}
HDU 4479 权递增的最短路问题的更多相关文章
- HDU 4479 Shortest path 带限制最短路
题意:给定一个图,求从1到N的递增边权的最短路. 解法:类似于bellman-ford思想,将所有的边先按照权值排一个序,然后依次将边加入进去更新,每条边只更新一次,为了保证得到的路径是边权递增的,每 ...
- 1160: sundari && Shortest path HDU - 4479
http://gdutcode.sinaapp.com/problem.php?id=1160 http://acm.hdu.edu.cn/showproblem.php?pid=4479 35 51 ...
- HDU 6464 权值线段树 && HDU 6468 思维题
免费送气球 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 1087 最大递增子序列
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- HDU 6464 /// 权值线段树
题目大意: 共Q次操作 操作有两种 操作一 在序列尾部加入f[i]个s[i] 操作二 查询序列第f[i]小到第s[i]小之间的总和 离线操作 把序列内的值离散化 然后利用离散化后的值 在线段树上对应权 ...
- HDU 5636 关键点的 floyd 最短路问题
Shortest Path Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- hdu 1087 最大递增和
思路和LIS差不多,dp[i]为i结尾最大值 #include <iostream> #include <string> #include <cstring> #i ...
- hdu 1087 最大递增子序列和
#include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #defin ...
- 最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)
最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最 ...
随机推荐
- performClick()方法的使用
performClick 是使用代码主动去调用控件的点击事件(模拟人手去触摸控件) 例如: 添加Ctrl+s 快捷键 保存,并触发btnSave按钮事件 protected override bool ...
- TC609 DIV1 (500)
Problem Statement We have balls of K different colors. The colors are numbered 0 through K-1, a ...
- Partial(部分方法,局部方法),virtual(虚方法),abstract(抽象方法)
Partial 部分方法顾明思议是方法的一部分,不完整的,在ide编译时候,会将所有部分方法加载到一起统一编译,如果分部方法没有被实现,编译器就不会.对他们进行编译. 局部类型的限制 (1) 局部类型 ...
- IIS7.0中Process打开cmd程序出现问题
本人在VS中用Process打开cmd程序,并传入参数,转换图片,运行成功! 但是放入IIS7.0中,Process打不开cmd程序,程序直接运行过去,无结果,无报错! 解决方案: 将IIS里面你程序 ...
- for循环的两种写法哪个快
结果如下: 其实工作中,也没有这么多数据需要遍历,基本上用foreach
- js内置对象总结
在js里,一切皆为或者皆可以被用作对象.可通过new一个对象或者直接以字面量形式创建变量(如var i="aaa"),所有变量都有对象的性质. 注意:通过字面量创建的对象在调用属性 ...
- call方法的使用bug--参数undefined
call/apply是函数原型定义的方法(Function.prorotype),在使用时要注意第一个形参(args[0]),一定是指向函数所要挂载的上下文对象--context,若对象非必须,则要将 ...
- .NET 出现参数化查询 需要参数但未提供该参数的错误
1.问题的来源 在.NET或者C#中,我们一般执行sql语句的话,推荐使用参数化查询,这样可以避免sql注入的攻击,但是,我在使用参数化查询的时候 出现了以下的错误,详细如下图: 图一这是写sql语句 ...
- 【PostgreSQL-9.6.3】Red Hat 4.4.7下的安装
1. 下载源码包https://www.postgresql.org/ftp/source/v9.6.1/ 2. 上传到/opt目录下 3. 创建postgres用户及dba组,并修改压缩包的属主属组 ...
- Farseer.net轻量级ORM开源框架 V1.5版本升级消息
SHA-1: 0ede88104f269f108b68be1e87ffcead4a354ec6 * 提交V1.5版本1.新增:整表缓存的实现方式(提取接口,可由客户端算定义实现)2.新增:SQL配置化 ...