bzoj2763: [JLOI2011]飞行路线 分层图+dij+heap

分析:d[i][j]代表从起点到点j,用了i次免费机会,那就可以最短路求解

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=1e4+5;
int d[12][N],head[N],tot,n,m,k,s,t;
struct Edge{
  int v,w,next;
}edge[10*N];
void add(int u,int v,int w){
  edge[tot].v=v;
  edge[tot].w=w;
  edge[tot].next=head[u];
  head[u]=tot++;
}
struct Node{
  int cur,v,dis;
  bool operator<(const Node &rhs)const{
    return dis>rhs.dis;
  }
};
priority_queue<Node>q;
bool vis[12][N];
int dij(){
  memset(d,INF,sizeof(d));
  memset(vis,0,sizeof(vis));
  d[0][s]=0;
  q.push(Node{0,s,0});
  while(!q.empty()){
    int cur=q.top().cur,u=q.top().v;
    q.pop();
    if(vis[cur][u])continue;
    vis[cur][u]=1;
    for(int i=head[u];~i;i=edge[i].next){
       int v=edge[i].v;
       if(!vis[cur][v]&&d[cur][v]>d[cur][u]+edge[i].w){
        d[cur][v]=d[cur][u]+edge[i].w;
        q.push(Node{cur,v,d[cur][v]});
       }
       if(cur+1>k)continue;
       if(!vis[cur+1][v]&&d[cur+1][v]>d[cur][u]){
         d[cur+1][v]=d[cur][u];
         q.push(Node{cur+1,v,d[cur+1][v]});
       }
    }
  }
  return d[k][t];
}
int main(){
  scanf("%d%d%d",&n,&m,&k);
  memset(head,-1,sizeof(head)),tot=0;
  scanf("%d%d",&s,&t);
  for(int i=1;i<=m;++i){
    int u,v,w;
    scanf("%d%d%d",&u,&v,&w);
    add(u,v,w),add(v,u,w);
  }
  printf("%d\n",dij());
  return 0;
}

时间: 2024-10-26 07:24:07

bzoj2763: [JLOI2011]飞行路线 分层图+dij+heap的相关文章

bzoj2763: [JLOI2011]飞行路线(分层图spfa)

2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3234  Solved: 1235[Submit][Status][Discuss] Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Alice和Bob现在要从一个城市沿着航线到达另一个城

BZOJ2763[JLOI2011]飞行路线 [分层图最短路]

2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2523  Solved: 946[Submit][Status][Discuss] Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Alice和Bob现在要从一个城市沿着航线到达另一个城市

bzoj 2763 [JLOI2011]飞行路线——分层图

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 分层图两种方法的练习. 1.把图分成k+1层,本层去上面一层的边免费.但空间时间都不算优秀. #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define ll long long using namespace std; const int N=1e4

[P4568][JLOI2011] 飞行路线 (分层图+最短路)

题意:有n个城市,m条航线,每条航线都有一个权值,并且还多了k次免费航行的机会,求1~n的最短路: 做法:分层图+最短路: 1.分层图:因为多了k次免费航行,所以可以考虑建出k+1个图,然后跑一遍最短路: 2.最短路:既然能写分层图,那么最短路应该都会了吧,可以用 dijkstra 或 SPFA : 附上代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm>

P4568 [JLOI2011]飞行路线 &amp;&amp; 分层图最短路板子

目录说:我在右边 什么是分层图最短路: 分层图最短路是指在可以进行分层图的图上解决最短路问题. 一般模型是: 在图上,有k次机会可以直接通过一条边(权值为0),问起点与终点之间的最短路径. 解决的一般思路: 以这个题为例,给出了k次可以免费通过一个点的机会, 我们可以把原来的图垒在一起; ex: k = 1 1 2 3 2 3 4 3 1 2 4 2 1 4 3 6 我们在建完图之后再加上图中权值为0的边,很明显的分成了两层(若k = 1). 如果上边的那一层走到了下边,那就说明用了一次免费的机

bzoj 2763: [JLOI2011]飞行路线 分层图

题目链接 n个点m条路, 每条路有权值,  给出起点和终点, 求一条路使得权值最小.可以使路过的路中, k条路的权值忽略. 其实就是多一维, 具体看代码 #include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a)

P4568 飞行路线 分层图最短路

P4568 飞行路线 分层图最短路 分层图最短路 问题模型 求最短路时,可有\(k\)次更改边权(减为0) 思路 在普通求\(Dijkstra\)基础上,\(dis[x][j]\)多开一维\(j\)以存已用了多少次机会,然后每次松弛时,做完普通松弛操作后,还要使用一次机会(如果可以),类同\(DP\). 每次普通松弛: \[ dis[to][j]=min\{dis[cur][j], dis[to][j]\} \] 如果还可以使用(\(j<k\)): \[ dis[to][j+1] = min\{

【BZOJ2763】【JLOI2011】飞行路线 分层图

所谓分层图就是有多维状态的有边长图,然后比起正常的最短路转移就是多了一种跨维度转移的状态转移. 一般都是舍去某边长度,最多舍多少次(次数较少).详见代码. #include <queue> #include <cstdio> #include <cstring> #include <algorithm> #define N 11000 #define M 51000 #define inf 0x3f3f3f3f using namespace std; st

Dijkstra BZOJ2763 [JLOI2011]飞行路线

2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3089  Solved: 1158[Submit][Status][Discuss] Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Alice和Bob现在要从一个城市沿着航线到达另一个城