题目链接:

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. 洛谷P3588 [POI2015]PUS

    题面 sol:说了是线段树优化建图的模板... 就是把一整个区间的点连到一个点上,然后用那个点来连需要连一整个区间的点就可以了,就把边的条数优化成n*log(n)了 #include <queu ...

  2. css修改input表单默认样式重置与自定义大全

    链接地址: 伪元素表单控件默认样式重置与自定义大全 http://www.zhangxinxu.com/wordpress/?p=3381 Chrome 现在不支持通过伪元素修改 meter 元素样式 ...

  3. Redundant Paths POJ - 3177(边—双连通分量)

    题意: 在图中加边 看最少能通过加多少条边把 图变成边—双连通分量 解析: 先做一次dfs,不同的连通分量的low是不同的  注意重边 缩点 统计度为1的点  那么需要加的边为(ret+1)/2 #i ...

  4. 【AtCoder010】A - Addition(奇偶)

    AtCoder Grand Contest 010 A题 题目链接 题意 n个数,每次取两个奇偶性相同的数用他们的和代替他们,问最后能否只剩下一个数. 题解 因为奇偶相同的两个数之和一定是偶数,所以Y ...

  5. Markdown公式编辑学习笔记

    一.公式使用参考 1.如何插入公式 行中公式(放在文中与其它文字混编)可以用如下方法表示:$ 数学公式 $ 独立公式可以用如下方法表示:$$ 数学公式 $$ 自动编号的公式可以用如下方法表示: 若需要 ...

  6. AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)

    题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...

  7. 实现 60fps 的网易云音乐首页

    网易云音乐是一款很优秀的音乐软件,我也是它的忠实用户.最近在研究如何更好的开发TableView,接着我写了一个Model驱动的小框架 - MDTable.为了去验证框架的可用性,我选择了网易云音乐的 ...

  8. 青蛙跳台阶(C、Python)

    C语言: /* ----------------------------------- 当n = 1, 只有1中跳法:当n = 2时,有两种跳法:当n = 3 时,有3种跳法:当n = 4时,有5种跳 ...

  9. luogu2827 [NOIp2016]蚯蚓 (模拟)

    可以直观地想到用优先队列来做,但数据范围是O(n)的 然后我们发现,因为我们每次挑出来的蚯蚓是单调的,所以把每个切成两段后,那两段也是对应单调的 也就是说,算上最一开始的蚯蚓,我们一共维护三个队列,三 ...

  10. 解决IIS8中 URLRewriter 不能使用的方法

    1.把应用程序池改成集成 2.的web.config 加入代码 <system.webServer> <validation validateIntegratedModeConfig ...