题目链接:

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. HTML-封装原生Ajax

    function ajax(data){ //data{data:"",dataType:"xml/json",type:"get/post" ...

  2. Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence

    题目链接:http://codeforces.com/contest/612/problem/C 解题思路: 题意就是要求判断这个序列是否为RBS,每个开都要有一个和它对应的关,如:<()> ...

  3. MT【30】椭圆的第二定义解题

    问题:上式表示的区域是怎样的? 解答:利用椭圆第二定义易知当取等号时为椭圆,又令$y$趋向于$+\infty$时不等号不成立,故可以判断为椭圆内部区域. 评:利用mathmatics软件容易得到

  4. MT【29】介绍向量的外积及应用举例

    我们在学校教材里学到的数量积(内积)其实还有一个孪生兄弟向量积(外积),这个对参加自主招生以及竞赛的学生来讲是需要掌握的,这里稍作介绍: 原理: 例题: 应用:

  5. Heaven of Imaginary(PKUSC2018)

    Day-4 巨佬一个星期前就停了课,而蒟蒻还在教室里,收拾一地学科的烂摊子. 蒟蒻为什么要停课呢?真的有\(1\%\)的可能,成功报名PKUSC吗? 真的有. 蒟蒻滚回了机房. 三天,能做些什么呢?可 ...

  6. 【题解】 Codeforces Edu41 F. k-substrings (字符串Hash)

    题面戳我 Solution 我们正着每次都要枚举从长到短,时间复杂度承受不了,但是我们可以发现一个规律,假设某次的答案为\(x\),那么这个字符串为\(A+X+B\)组成,无论中间的\(X\)是重叠还 ...

  7. android 组件使用()

    程序入口点 类似于win32程序里的WinMain函数,Android自然也有它的程序入口点.它通过在AndroidManifest.xml文件中配置来指明,可以看到名为NotesList的activ ...

  8. [luogu1829][bzoj2154][国家集训队]Crash的数字表格 / JZPTAB【莫比乌斯反演】

    传送门:洛谷,bzoj 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时整除a和b的最小正整 ...

  9. SharePoint 2013 批量导入、删除帐号

    删除一个group里所有的帐号: cls ########################### # "Enter the site URL here" $SITEURL = &q ...

  10. suoi21 高能显示屏 (cdq分治)

    可以把翻倍的操作看作是一个查询和修改(增加刚查询得来的值)的符合操作,然后做cdq就行了 #include<bits/stdc++.h> #define pa pair<int,in ...