题目链接:

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. sorted新用法

  2. Django的ORM常用查询操作总结(Django编程-3)

    Django的ORM常用查询操作总结(Django编程-3) 示例:一个Student model: class Student(models.Model): name=models.CharFiel ...

  3. php动态获取常量

    class A1{ const V1='100'; const V2='200'; const V3='Hello world'; } $v1 = 'V3'; $a1 = constant('A1:: ...

  4. 13 Zabbix Item类型之Zabbix ODBC类型

    点击返回:自学Zabbix之路 13 Zabbix Item类型之Zabbix ODBC类型 ODBC是C语言开发的.用于访问数据库的中间件接口 . zabbix支持查询任何ODBC支持的数据库.za ...

  5. [luogu2144][bzoj1002][FJOI2007]轮状病毒【高精度+斐波那契数列+基尔霍夫矩阵】

    题目描述 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病 ...

  6. 利用Springboot-mail发送邮件

    相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看 ...

  7. [POI2015]CZA

    [POI2015]CZA p很小,讨论 p=0... p=1... p=2:n-1放左或者放右两种情况,剩下怎么放是固定的,模拟然后判断即可 p=3: 正着做要状压,类似放书和排座位那些题,考虑以某个 ...

  8. BAPC2017

    Benelux Algorithm Programming Contest 2017 参考资料: https://blog.csdn.net/sizaif/article/details/798586 ...

  9. mysql 多表管理修改

    update t_res_ys,cms_article_data,cms_article set cms_article_data.jsdata=t_res_ys.jsdata ,cms_articl ...

  10. “==”运算符与equals()

    “==”运算符,比较内存地址 equals(),比较内容(值) public class Book { public static void main(String[] args) { String ...