bzoj2763 [JLOI2011]飞行路线(分层图最短路)
来源:互联网 发布:人工智能领域 编辑:程序博客网 时间:2024/05/16 07:47
d[i][j]表示到i点,用了j次免费的最短路,每个j对应了一层。因此唤做分层图。更新时,本层自然要做,还可以跨维度的把下一层也影响了。不过我跑得好慢。。。看各位神犇都是1S以内的。。我知道了,是spfa慢。。Dijkstra才240ms。
spfa版 7380ms
#include <bits/stdc++.h>using namespace std;#define pa pair<int,int>#define ll long long#define inf 0x3f3f3f3f#define N 10010#define M 50010inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f;}int n,m,k,s,t,h[N],num=0,d[N][12],ans=inf;//d[i][j]表示到i点,用了j次免费的最短路 bool inq[N][12];struct edge{ int to,next,val;}data[M<<1];void spfa(){ queue<pa>q;memset(d,0x3f,sizeof(d)); q.push(make_pair(s,0));inq[s][0]=1;d[s][0]=0; while(!q.empty()){ int x=q.front().first,kx=q.front().second;q.pop();inq[x][kx]=0; for(int i=h[x];i;i=data[i].next){ int y=data[i].to; if(d[x][kx]+data[i].val<d[y][kx]){//转移本层 d[y][kx]=d[x][kx]+data[i].val; if(!inq[y][kx]) q.push(make_pair(y,kx)),inq[y][kx]=1; } if(kx+1<=k&&d[x][kx]<d[y][kx+1]){//转移下层 d[y][kx+1]=d[x][kx]; if(!inq[y][kx+1]) q.push(make_pair(y,kx+1)),inq[y][kx+1]=1; } } }}int main(){// freopen("a.in","r",stdin); n=read();m=read();k=read();s=read();t=read(); while(m--){ int x=read(),y=read(),val=read(); data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val; data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].val=val; } spfa(); for(int i=0;i<=k;++i) ans=min(ans,d[t][i]); printf("%d\n",ans); return 0;}
Dijkstra版 240ms
#include <bits/stdc++.h>using namespace std;#define pa pair<int,pair<int,int> >#define ll long long#define inf 0x3f3f3f3f#define N 10010#define M 50010inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f;}int n,m,k,s,t,h[N],num=0,d[N][12],ans=inf;//d[i][j]表示到i点,用了j次免费的最短路 bool f[N][12];struct edge{ int to,next,val;}data[M<<1];void Dijkstra(){ priority_queue<pa,vector<pa>,greater<pa> >q; memset(d,0x3f,sizeof(d)); q.push(make_pair(0,make_pair(s,0)));d[s][0]=0; while(!q.empty()){ int x=q.top().second.first,kx=q.top().second.second; q.pop();if(f[x][kx]) continue;f[x][kx]=1; for(int i=h[x];i;i=data[i].next){ int y=data[i].to; if(d[x][kx]+data[i].val<d[y][kx]){ d[y][kx]=d[x][kx]+data[i].val; q.push(make_pair(d[y][kx],make_pair(y,kx))); } if(kx+1<=k&&d[x][kx]<d[y][kx+1]){ d[y][kx+1]=d[x][kx]; q.push(make_pair(d[y][kx+1],make_pair(y,kx+1))); } } }}int main(){// freopen("a.in","r",stdin); n=read();m=read();k=read();s=read();t=read(); while(m--){ int x=read(),y=read(),val=read(); data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val; data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].val=val; } Dijkstra(); for(int i=0;i<=k;++i) ans=min(ans,d[t][i]); printf("%d\n",ans); return 0;}
阅读全文
0 0
- 【bzoj2763】 JLOI2011飞行路线 分层最短路
- [BZOJ2763][JLOI2011][分层图最短路]飞行路线
- bzoj2763: [JLOI2011]飞行路线 分层图最短路
- BZOJ2763 [JLOI2011]飞行路线(分层图最短路)
- 【JLOI2011】【bzoj2763】飞行路线 分层图最短路
- BZOJ2763[JLOI2011]飞行路线 【分层图最短路】
- bzoj2763[JLOI2011]飞行路线 分层图最短路
- [bzoj2763]2763: [JLOI2011]飞行路线 分层图最短路
- bzoj2763 [JLOI2011]飞行路线(分层图最短路)
- [bzoj2763]飞行路线 分层图最短路
- [JLOI2011]飞行路线 分层图最短路
- 【BZOJ2763】【JLOI2011】飞行路线 分层图
- 分层图,bzoj2763: [JLOI2011]飞行路线
- BZOJ 2763: [JLOI2011]飞行路线(分层图最短路)
- BZOJ_P2763 [JLOI2011]飞行路线(分层图+最短路)
- poj 2763: [JLOI2011]飞行路线(spfa分层图最短路)
- bzoj 2763: [JLOI2011]飞行路线 分层图最短路
- BZOJ 2763: [JLOI2011]飞行路线 分层图最短路
- Eclipse快捷键把一段代码向左右移动和注释一块代码
- GBDT与随机森林区别
- Java中的关系操作符
- C# 创建验证码图片
- ACM周中总结—9月7日
- bzoj2763 [JLOI2011]飞行路线(分层图最短路)
- jsp之间url传值,接值
- 周中记录--2017.9.7(线段树整理)
- es6 map和 weakmap
- JSP动作元素
- HDU 3068 最长回文(Manacher)
- PID调节经验
- 已有java文件添加到工程中的两种方法
- Ubuntu16.04 安装Python开发环境