BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级:dijkstra 分层图【将k条边改为0】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1579
题意:
给你一个无向图,n个点,m条边,每条边有边权w[i]。
你可以将其中的k(k <= 20)条边的边权改为0。
问你从1到n的最短路。
题解:
dis[i][j]表示到达i点,已经改了j次边权,此时的最短路。
相当于将原图复制成了k层,每改变一次,就向下走一层。
两种情况(如果可以变优):
(1)不用变0技能:转移到dis[dest][j] = dis[now][j] + len
(2)用变0技能:转移到dis[dest][j+1] = dis[now][j]
还有此题卡spfa,要用dijkstra。
因为dijkstra每次处理的点,最小值都已经确定。
所以第一次now.idx == n的时候,now.dis即为答案。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#define MAX_N 10005
#define MAX_K 25 using namespace std; struct Edge
{
int dest;
int len;
Edge(int _dest,int _len)
{
dest=_dest;
len=_len;
}
Edge(){}
}; struct Node
{
int idx;
int cnt;
int dis;
Node(int _idx,int _cnt,int _dis)
{
idx=_idx;
cnt=_cnt;
dis=_dis;
}
Node(){}
friend bool operator < (const Node &a,const Node &b)
{
return a.dis>b.dis;
}
}; int n,m,k;
int ans;
int dis[MAX_N][MAX_K];
vector<Edge> edge[MAX_N];
priority_queue<Node> q; void read()
{
cin>>n>>m>>k;
int a,b,v;
for(int i=;i<m;i++)
{
cin>>a>>b>>v;
edge[a].push_back(Edge(b,v));
edge[b].push_back(Edge(a,v));
}
} int dijkstra(int start,int dst)
{
memset(dis,0x3f,sizeof(dis));
q.push(Node(start,,));
dis[start][]=;
while(!q.empty())
{
Node now=q.top();
q.pop();
if(now.idx==dst) return now.dis;
if(dis[now.idx][now.cnt]<now.dis) continue;
for(int i=;i<edge[now.idx].size();i++)
{
Edge temp=edge[now.idx][i];
if(dis[temp.dest][now.cnt]>now.dis+temp.len)
{
dis[temp.dest][now.cnt]=now.dis+temp.len;
q.push(Node(temp.dest,now.cnt,dis[temp.dest][now.cnt]));
}
if(dis[temp.dest][now.cnt+]>now.dis && now.cnt+<=k)
{
dis[temp.dest][now.cnt+]=now.dis;
q.push(Node(temp.dest,now.cnt+,dis[temp.dest][now.cnt+]));
}
}
}
} void solve()
{
ans=dijkstra(,n);
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}
BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级:dijkstra 分层图【将k条边改为0】的更多相关文章
- bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级【分层图+spfa】
至死不用dijskstra系列2333,洛谷上T了一个点,开了O2才过 基本想法是建立分层图,就是建k+1层原图,然后相邻两层之间把原图的边在上一层的起点与下一层的终点连起来,边权为0,表示免了这条边 ...
- Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1573 Solv ...
- BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路
BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...
- BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级( 最短路 )
最短路...多加一维表示更新了多少条路 -------------------------------------------------------------------------------- ...
- bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 -- 分层图最短路
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MB Description 每天,农夫 ...
- bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 优先队列+dij
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1768 Solv ...
- BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级 分层图最短路 + Dijkstra
Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...
- bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级——分层图+dijkstra
Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...
- BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级
堆优化的dijkstra. 把一个点拆成k个. 日常空间要开炸一次.. //Twenty #include<cstdio> #include<cstring> #include ...
随机推荐
- STL之pair类型具体分析
pair定义于头文件utility中.基本的作用是将两个数据组合成一个数据,两个数据能够是同一类型或者不同类型. pair类型提供的操作: pair<T1,T2> p1; pair< ...
- Vue 渲染优先级
当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级.
- javascript 数组Array排序
var numberAry = [9,9,10,8,7,80,33,55,22]; numberAry.sort(); /*输出:10,22,33,55,7,8,80,9,9 上面的代码没有按照数值的 ...
- -ROOT-表和.META.表结构详解
在<HBase技术简介>中我们知道,HBase中有两个特殊的表:-ROOT-和.META.. 由于HBase中的表可能非常大,故HBase会将表按行分成多个region,然后分配到多台Re ...
- Java 加解密技术系列之 DES
序 前几篇文章讲的都是单向加密算法.当中涉及到了 BASE64.MD5.SHA.HMAC 等几个比較常见的加解密算法. 这篇文章,以及后面几篇.打算介绍几个对称加密算法.比方:DES.3DES(Tri ...
- MySql(四):备份与恢复
一.数据库备份使用场景 下面我就列举一下我个人理解的我们能够需要用到数据库备份的一些比较常见的情况吧. a.数据丢失应用场景 1.人为操作失误造成某些数据被误操作:2.软件BUG 造成数据部分或者全部 ...
- Netty(五):Netty中如何序列化数据
JDK提供了ObjectOutputStream和ObjectInputStream,用于通过网络对POJO的基本数据类型和图进行序列化和反序列化.该API并不复杂,而且可以被应用于任何实现了java ...
- nodejs初学-----helloworld
近期紧锣密鼓的学习了下nodejs(之前在学php.算入门了吧,可是时间关系,还没写文章,兴许要搞安卓和大数据,总之比較忙哈,计划上php要排到后面了,还请广大小伙伴不要着急) 先抄一句:Node.j ...
- 常见的CPU訪问引起的内存保护问题为什么仅仅用event_122上报 - 举例2
还有一个样例.通过以下的log看,CPU在訪问reserved的地址0x53611EFD.非法訪问时该地址会在L1D内存控制器的L1DMPFSR寄存器中记录. ** FATAL EXCEPTION N ...
- FZU2125:简单的等式
Problem Description 如今有一个等式例如以下:x^2+s(x,m)x-n=0. 当中s(x,m)表示把x写成m进制时,每一个位数相加的和.如今,在给定n,m的情况下,求出满足等式的最 ...