题目链接:

https://nanti.jisuanke.com/t/31001

超时代码:

#include<bits/stdc++.h>
using namespace std;
# define maxn 10000000+10
# define inf 0x3f3f3f3f
int n,m,k;
int num;
int head[maxn];
int dis[maxn];
int vis[maxn];
struct node
{
int ne;
int to;
int co;
} q[maxn];
void add(int u,int v,int w)
{
q[++num].ne=head[u];
q[num].to=v;
q[num].co=w;
head[u]=num;
}
void spfa()
{
queue<int >p;
while(!p.empty())p.pop();
memset(dis,inf,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[1]=0;
vis[1]=1;
p.push(1);
while(!p.empty())
{
int top=p.front();
vis[top]=0;
p.pop();
for(int i=head[top]; i!=-1; i=q[i].ne)
{
int temp=q[i].to;
if(dis[temp]>dis[top]+q[i].co)
{
dis[temp]=dis[top]+q[i].co;
if(!vis[temp])
{
vis[temp]=1;
p.push(temp);
}
}
}
}
}
void solve()
{
spfa();
int minn=inf;
for(int i=0; i<=k; i++)
{
minn=min(minn,dis[n+i*n]);
}
printf("%d\n",minn);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(head,-1,sizeof(head));
num=0;
scanf("%d%d%d",&n,&m,&k);
if(k==0)
{
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);
}
spfa();
printf("%d\n",dis[n]);
return 0;
}
else
{
for(int i=1; i<=m; i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
for(int j=0; j<=k; j++)
{
add(u+(n*j),v+(n*j),w);
add(v+(n*j),u+(n*j),w);
if(j<k)
{
add(u+(j)*n,v+(j+1)*n,0);
add(v+(j)*n,u+(j+1)*n,0);
}
}
}
solve();
}
}
return 0;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
# define maxn 100500
# define maxm 6000500//这个地方要注意,并不熟一层图中包括多少点就有多少条边的,还有很多边是没用的
# define inf 0x3f3f3f3f
# define ll long long
ll n,m,k;
ll num;
struct Edge
{
ll to;
ll ne;
ll co;
} q[maxm];
ll head[maxm];
ll dis[maxm];
void add(ll a,ll b,ll c)
{
q[++num].ne=head[a];
q[num].to=b;
q[num].co=c;
head[a]=num;
}
struct node
{
ll num;
ll dis;
node() {}
node(ll x,ll y)
{
num=x;
dis=y;
}
friend bool operator < (node a,node b)
{
return a.dis>b.dis;
}
};
void dijkstra()
{
priority_queue<node >p;
memset(dis,inf,sizeof(dis));
dis[1]=0;
p.push(node(1,dis[1]));
while(!p.empty())
{
node t=p.top();
p.pop();
for(int i=head[t.num]; i!=-1; i=q[i].ne)
{
int temp=q[i].to;
if(dis[temp]>dis[t.num]+q[i].co)
{
dis[temp]=dis[t.num]+q[i].co;
p.push(node(temp,dis[temp]));
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(head,-1,sizeof(head));
num=0;
scanf("%lld%lld%lld",&n,&m,&k);
if(k>=m)
{
printf("%d\n",0);
continue;
}
for(int i=1; i<=m; i++)
{
ll u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
for(int j=0; j<=k; j++)
{
add(u+n*j,v+n*j,w);
if(j!=k)
{
add(u+n*j,v+n*(j+1),0);
}
}
}
dijkstra();
ll ans=inf ;
for(int i=0; i<=k; i++){
ans=min(ans,dis[n+i*n]);
// cout<<dis[n+i*n]<<endl;
}
printf("%lld\n",ans);
}
return 0;
}

ACM-ICPC 2018 南京赛区网络预赛 L题(分层图,堆优化)的更多相关文章

  1. ACM-ICPC 2018 南京赛区网络预赛 L 【分层图最短路】

    <题目链接> 题目大意: 有N个城市,这些城市之间有M条有向边,每条边有权值,能够选择K条边 边权置为0,求1到N的最短距离. 解题分析: 分层图最短路模板题,将该图看成 K+1 层图,然 ...

  2. ACM-ICPC 2018 南京赛区网络预赛 L题(分层最短路)

    题目链接:https://nanti.jisuanke.com/t/31001 题目大意:给出一个含有n个点m条边的带权有向图,求1号顶点到n号顶点的最短路,可以使<=k条任意边的权值变为0. ...

  3. ACM-ICPC 2018 南京赛区网络预赛 E题

    ACM-ICPC 2018 南京赛区网络预赛 E题 题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest wi ...

  4. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze

    262144K   There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v ...

  5. ACM-ICPC 2018 焦作赛区网络预赛 L 题 Poor God Water

    God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...

  6. ACM-ICPC 2018 南京赛区网络预赛 L.Magical Girl Haze(分层最短路)

    There are N cities in the country, and M directional roads from u to v(1≤u,v≤n). Every road has a di ...

  7. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze 最短路+分层图

    类似题解 There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v(1≤u, ...

  8. ACM-ICPC 2018 南京赛区网络预赛 - L Magical Girl Haze (分层迪杰斯特拉)

    题意:N个点,M条带权有向边,求可以免费K条边权值的情况下,从点1到点N的最短路. 分析:K<=10,用dist[i][j]表示从源点出发到点i,免费j条边的最小花费.在迪杰斯特拉的dfs过程中 ...

  9. ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路

    https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析  分层最短路  我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...

随机推荐

  1. mysql 创建表指定 字符类型与存储引擎

    DROP TABLE IF EXISTS apilog; /*==============================================================*/ /* T ...

  2. Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)

    Linux LVM逻辑卷配置过程详解 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据, ...

  3. Colored Sticks POJ - 2513(trie树欧拉路)

    题意: 就是无向图欧拉路 解析: 不能用map..超时 在判断是否只有一个联通的时候,我比较喜欢用set,但也不能用set,会超时,反正不能用stl emm 用trie树来编号就好了 #include ...

  4. Java中的split函数拆分后变成null的问题

    对于一些特殊的情况,split拆分后并没有保留全的元素 如下例子: String x ="a,,,,,,"; String []y = x.split(",") ...

  5. 【题解】 Codeforces Edu44 F.Isomorphic Strings (字符串Hash)

    题面戳我 Solution 我们按照每个字母出现的位置进行\(hash\),比如我们记录\(a\)的位置:我们就可以把位置表示为\(0101000111\)这种形式,然后进行字符串\(hash\) 每 ...

  6. pandas的筛选功能,跟excel的筛选功能类似,但是功能更强大。

    Select rows from a DataFrame based on values in a column -pandas 筛选 https://stackoverflow.com/questi ...

  7. 自学Linux Shell12.5-while、until命令

    点击返回 自学Linux命令行与Shell脚本之路 12.5-while.until命令 until 循环与 while 循环在处理方式上刚好相反. while循环用于不断执行一系列命令,也用于从输入 ...

  8. 洛谷 P2680 运输计划 解题报告

    P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...

  9. Spark安装与介绍

    1. Scala的安装 注意点:版本匹配的问题, Spark 1.6.2 -- Scala2.10 Spark 2.0.0 -- Scala2.11 https://www.scala-lang.or ...

  10. 经典的GDB调试命令

    在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是: printprint /是表达式,是你所调试的程 ...