题目: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+,M=5e4+,K=;
int n,m,k,head[N*K],xnt,s,t;
ll dis[N*K],ans=0x7fffffff;
bool vis[N*K];
struct Edge{
int next,to,w;
Edge(int n=,int t=,int w=):next(n),to(t),w(w) {}
}edge[M*K<<];
void add(int x,int y,int z)
{
for(int fx=;fx<=k*n;fx+=n)
{
edge[++xnt]=Edge(head[x+fx],y+fx,z);head[x+fx]=xnt;
if(fx<k*n)
edge[++xnt]=Edge(head[x+fx],y+fx+n,),head[x+fx]=xnt;
}
}
void dj()
{
memset(dis,,sizeof dis);dis[s]=;
priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > > q;
q.push(make_pair(,s));
while(q.size())
{
int u=q.top().second;q.pop();
while(vis[u]&&q.size())u=q.top().second,q.pop();
if(vis[u])break;vis[u]=;
for(int i=head[u],v;i;i=edge[i].next)
if(dis[v=edge[i].to]>dis[u]+edge[i].w)
{
dis[v]=dis[u]+edge[i].w;q.push(make_pair(dis[v],v));
}
}
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
int x,y,z;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
dj();
for(int fx=;fx<=k*n;fx+=n)ans=min(ans,dis[t+fx]);
printf("%lld",ans);
return ;
}

2.设计dp状态,套在最短路上。就不用建边,从而省空间。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const int N=1e4+,M=5e4+,K=;
int n,m,k,s,t,head[N],xnt;
ll ans=0x7fffffff,dp[N][K];
bool vis[N][K];
struct Edge{
int next,to,w;
Edge(int n=,int t=,int w=):next(n),to(t),w(w) {}
}edge[M<<];
void add(int x,int y,int z)
{
edge[++xnt]=Edge(head[x],y,z);head[x]=xnt;
edge[++xnt]=Edge(head[y],x,z);head[y]=xnt;
}
void spfa()
{
memset(dp,,sizeof dp);dp[s][]=;
queue<pair<int,int> > q;q.push(make_pair(s,));vis[s][]=;
while(q.size())
{
int u=q.front().first,d=q.front().second;q.pop();
vis[u][d]=;
for(int i=head[u],v;i;i=edge[i].next)
{
if(dp[v=edge[i].to][d]>dp[u][d]+edge[i].w)
{
dp[v][d]=dp[u][d]+edge[i].w;
if(!vis[v][d])vis[v][d]=,q.push(make_pair(v,d));
}
if(d<k&&dp[v][d+]>dp[u][d])
{
dp[v][d+]=dp[u][d];
if(!vis[v][d+])vis[v][d+]=,q.push(make_pair(v,d+));
}
}
}
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
int x,y,z;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);add(x,y,z);
}
spfa();
for(int i=;i<=k;i++)ans=min(ans,dp[t][i]);
printf("%lld",ans);
return ;
}

  上面的代码巨慢!用dj的话可以及时推出,所以会非常快!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const int N=1e4+,M=5e4+,K=;
int n,m,k,s,t,head[N],xnt;
ll ans=0x7fffffff,dp[N][K];
bool vis[N][K];
struct Edge{
int next,to,w;
Edge(int n=,int t=,int w=):next(n),to(t),w(w) {}
}edge[M<<];
struct Node{
ll dis;int v,c;
Node(ll d,int a,int b):dis(d),v(a),c(b) {}
bool operator<(const Node k)const
{
return dis>k.dis;
}
};
void add(int x,int y,int z)
{
edge[++xnt]=Edge(head[x],y,z);head[x]=xnt;
edge[++xnt]=Edge(head[y],x,z);head[y]=xnt;
}
void dj()
{
memset(dp,,sizeof dp);dp[s][]=;
priority_queue<Node> q;
q.push(Node(,s,));
while(q.size())
{
ll x=q.top().dis,u=q.top().v,d=q.top().c;q.pop();
while(vis[u][d]&&q.size())x=q.top().dis,u=q.top().v,d=q.top().c,q.pop();
if(vis[u][d])break;vis[u][d]=;
if(u==t){ans=x;return;}
for(int i=head[u],v;i;i=edge[i].next)
{
if(dp[v=edge[i].to][d]>x+edge[i].w)
{
dp[v][d]=x+edge[i].w;q.push(Node(dp[v][d],v,d));
}
if(d<k&&dp[v][d+]>x)
{
dp[v][d+]=x;q.push(Node(dp[v][d+],v,d+));
}
}
}
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
int x,y,z;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);add(x,y,z);
}
dj();
printf("%lld",ans);
return ;
}

bzoj 2763 [JLOI2011]飞行路线——分层图的更多相关文章

  1. bzoj 2763: [JLOI2011]飞行路线 -- 分层图最短路

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MB Description Alice和Bob现在要乘飞机旅行,他们选择了一家相 ...

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

    题目链接 n个点m条路, 每条路有权值,  给出起点和终点, 求一条路使得权值最小.可以使路过的路中, k条路的权值忽略. 其实就是多一维, 具体看代码 #include<bits/stdc++ ...

  3. Bzoj 2763: [JLOI2011]飞行路线 拆点,分层图,最短路,SPFA

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1694  Solved: 635[Submit][Statu ...

  4. 分层图+最短路算法 BZOJ 2763: [JLOI2011]飞行路线

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MB Description Alice和Bob现在要乘飞机旅行,他们选择了一家相 ...

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

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1728  Solved: 649[Submit][Statu ...

  6. BZOJ 2763: [JLOI2011]飞行路线 【分层图模板】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  M ...

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

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3234  Solved: 1235[Submit][Stat ...

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

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2523  Solved: 946[Submit][Statu ...

  9. BZOJ 2763: [JLOI2011]飞行路线 最短路

    2763: [JLOI2011]飞行路线 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

随机推荐

  1. 将 sql 数据库 编码 改成 Chinese_PRC_CS_AS

    use master go ) drop procedure [dbo].[p_killspid] GO create proc p_killspid ) --要关闭进程的数据库名 as ) ) de ...

  2. aliyun阿里云Maven仓库地址——加速你的maven构建 - 转载

    maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://maven.aliyun.com/nexus/#view-reposito ...

  3. Android中获取屏幕高度和宽度

    有时我们需要获取当前屏幕的高度和宽度,只需要在一个Activity的onCreate()方法中写上如下代码即可: //定义DisplayMetrics 对象 DisplayMetrics metric ...

  4. PermutationSequence,求第k个全排列

    问题描述:给定一个数组,数组里面元素不重复,求第k个全排列. 算法分析:这道题就是用到取商取模运算. public String getPermutation(int n, int k) { // i ...

  5. BZOJ 3931 [CQOI2015]网络吞吐量:最大流【拆点】

    传送门 题意 给你一个 $ n $ 个点,$ m $ 条边的无向网络,每条边有长度.每个点的流量限制为 $ c[i] $ . 要求流量只能经过从 $ 1 $ 的 $ n $ 的最短路.问你最大流是多少 ...

  6. 报错org.apache.ibatis.binding.BindingException: Type interface com.atguigu.mybatis.bean.dao.EmployeeMapper is not known to the MapperRegistry.

    报错org.apache.ibatis.binding.BindingException: Type interface com.atguigu.mybatis.bean.dao.EmployeeMa ...

  7. 如何进行数据库,比如ORACLE,SQL SERVER的逆向工程,将数据库导入到PowerDesigner中

    Oracle的反向工程就是指将Oracle中的数据库,当然也可以是SQL Server中的数据库导入到PD中,这个需要建立一个数据库的链接,然后进行逆向工程的操作. 第一步:建立数据库的链接: Pow ...

  8. 【lightoj-1063】Ant Hills(求割点)

    求割点模板题 #include <bits/stdc++.h> using namespace std; const int N = 10004; int dfn[N], low[N]; ...

  9. Struts08---全局结果和全局异常的配置

    01.创建测试页面 <%-- 验证全局结果 和 局部结果 --%> <a href="user/UserAction_add">新增用户</a> ...

  10. linux语言设置i18n(转)

    修改 /etc/sysconfig/i18n 文件,如 LANG="en_US.UTF-8",xwindow会显示英文界面, LANG="zh_CN.GB18030&qu ...