【Heap-Dijkstra】【分层图】bzoj2763 [JLOI2011]飞行路线

建立k+1张图,

在图与图之间,若在原图中x到y有边,就建立从 第i层的x 到 i+1层的y 建边,权值为0。代表一次免费机会。

由于一旦到了第i+1层的图里,则无法回到之前的层,所以免费最多只有k次。符合题意。

spfa会TLE。

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m,k,sta,end,x,y,z,ans=2147483647;
 7 struct Point{int d,u;Point(const int &a,const int &b){d=a;u=b;}Point(){}};
 8 bool operator < (const Point &a,const Point &b){return a.d>b.d;}
 9 priority_queue<Point>q;
10 bool vis[110001];
11 int d[110001],first[2100001],next[2100001],v[2100001],w[2100001],en;
12 void AddEdge(const int &U,const int &V,const int &W)
13 {v[++en]=V; w[en]=W; next[en]=first[U]; first[U]=en;}
14 void dijkstra(const int &s)
15 {
16     memset(vis,false,sizeof(vis));
17     memset(d,0x7f,sizeof(d)); d[s]=0;
18     q.push(Point(0,s));
19     while(!q.empty())
20       {
21           Point x=q.top(); q.pop();
22           if(!vis[x.u])
23             {
24                 vis[x.u]=true;
25                 for(int i=first[x.u];i;i=next[i])
26                   if(d[v[i]]>d[x.u]+w[i])
27                     {
28                       d[v[i]]=d[x.u]+w[i];
29                       q.push(Point(d[v[i]],v[i]));
30                     }
31             }
32       }
33 }
34 int main()
35 {
36     scanf("%d%d%d%d%d",&n,&m,&k,&sta,&end);
37     for(int i=1;i<=m;i++)
38       {
39         scanf("%d%d%d",&x,&y,&z);
40         AddEdge(x,y,z);
41         AddEdge(y,x,z);
42         for(int j=1;j<=k;j++)
43           {
44               AddEdge(x+(j-1)*n,y+j*n,0);
45               AddEdge(y+(j-1)*n,x+j*n,0);
46               AddEdge(x+j*n,y+j*n,z);
47               AddEdge(y+j*n,x+j*n,z);
48           }
49       }
50     dijkstra(sta);
51     for(int i=0;i<=k;i++) ans=min(ans,d[end+i*n]);
52     printf("%d\n",ans);
53     return 0;
54 }
时间: 2024-11-05 11:53:29

【Heap-Dijkstra】【分层图】bzoj2763 [JLOI2011]飞行路线的相关文章

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现在要从一个城市沿着航线到达另一个城市

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现在要从一个城市沿着航线到达另一个城

BZOJ2763 JLOI2011 飞行路线 最短路

题意:给定一张图,有可以将K条路径的花费变为0,求从1到N的最短路 题解: 分层图+最短路水过. 我们把原图复制K份,平行的放在一起(就像饼干一样一层层的),然后给每个图编号1 2 3……K,然后对于原图中每一条边(x,y),在i的x和i+1的y之间连一条边权为0的边,然后在这K个图上做最短路即可. 当然这只是个思想,实际上你只需要多开一维记录在哪个层里即可,不用真的再去开N*(K-1)个点. #include <queue> #include <cstdio> #include

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=0x3f3f3f3

BZOJ2763 [JLOI2011] 飞行路线

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2763 Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机.航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机.那么Alice和

Bzoj 2763: [JLOI2011]飞行路线 dijkstra,堆,最短路,分层图

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

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

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

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

[JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在 n 个城市设有业务,设这些城市分别标记为 0 到 n?1 ,一共有 m 种航线,每种航线连接两个城市,并且航线有一定的价格. Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机.航空公司对他们这次旅行也推出优惠,他们可以免费在最多 k 种航线上搭乘飞机.那么Alice和Bob这次出行最少花费多少? 输入输出格式 输入格式: 数据的第一行有三个整数