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的一棵最 ...
随机推荐
- MyEclipse2014+Maven配置记录
一.MyEclipse配置Maven 打开MyEclipse2014,选择菜单:Window --> Preferences,选择:MyEclipse-Maven4MyEclipse-Insta ...
- 员工管理系统(集合与IO流的结合使用 beta4.0 ObjectInputStream/ ObjectOutputStream)
package cn.employee_io; import java.io.Serializable; public class Employee implements Serializable{ ...
- [转]探索 Windows Azure Storage
本文转自:https://msdn.microsoft.com/zh-tw/jj573842 概觀 儲存服務 (Storage services) 在 Windows Azure 運算模擬器中提供了可 ...
- Oracle中默认创建的表
安装Oracle数据库后,会自动创建几个表.分别是emp.dept.bonus(也有可能不一样),这些表都在scott账户中.
- 教你如何在实战项目中使用WCF
我们都知道调用WCF直接在Service References中引用可以远程调用的WCF Url就行了. 但是我们想过没,在Development环境中可以这样做,但是QA.UAT.Productio ...
- AJPFX关于modifier总结
修饰符总结 Modifiers 函数修饰符始终在返回值类型之前!!! 变量修饰符始终在变量类型之前!!!---------------------------------- ...
- Discrete Logging
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5865 Accepted: 2618 ...
- 【JavaScript】随机生成10个0~100的数字
随机生成10个0~100不重复的数字(包含0和100): 需要用到的知识点:随机数 去重 下面放代码 <!DOCTYPE html> <html> <head> & ...
- 在JAVA中封装JSONUtils工具类及使用 (转)
import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util. ...
- Node.js——express
res.send(),比原生的 res.end() 强大,原生只支持字符串和Buffer对象,而且需要自己加响应报文头,send支持字符串.Buffer.Json对象.数组,而且自动加响应报文头 ap ...