BZOJ 2763 JLOI2011 飞行路线 分层图+堆优化SPFA
来源:互联网 发布:mac开机一个问号 编辑:程序博客网 时间:2024/05/18 01:28
题目大意:给定一个无向图,求源点到汇点的最短路,其中有k次机会把边权变为0
非常水的分层图。。话说所谓分层图其实就是多一维的SPFA。。。还起了这么个高大上的名字
这题裸SPFA过不去 要加堆优化 我的堆优化一定是写的有毛病 把heap[top--]=heap[0]改成top--就死活过不去 把魔法森林改一下测试了一下结果居然WA了
总之贴代码
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define M 10100using namespace std;struct abcd{ int to,f,next;}table[100100];typedef pair<int,int> ABCD;ABCD heap[M*10];unsigned short r,h;int head[M],tot,top;int n,m,k,s,t,ans=0x3f3f3f3f;int f[M][11],pos[M][11];void push_up(int t){ while( t>1 && f[heap[t].first][heap[t].second]<f[heap[t>>1].first][heap[t>>1].second] ) swap(heap[t],heap[t>>1]),swap(pos[heap[t].first][heap[t].second],pos[heap[t>>1].first][heap[t>>1].second]),t>>=1;}void insert(ABCD x){ heap[++top]=x; pos[x.first][x.second]=top; push_up(top);}void pop(){ pos[heap[1].first][heap[1].second]=0; heap[1]=heap[top]; //top--; heap[top--]=heap[0]; pos[heap[1].first][heap[1].second]=1; int t=2; while(t<=top) { if( f[heap[t].first][heap[t].second]>f[heap[t+1].first][heap[t+1].second] && t<top ) t++; if( f[heap[t].first][heap[t].second]<f[heap[t>>1].first][heap[t>>1].second] ) swap(heap[t],heap[t>>1]),swap(pos[heap[t].first][heap[t].second],pos[heap[t>>1].first][heap[t>>1].second]),t<<=1; else break; }}void SPFA(){ int i; ABCD x; memset(f,0x3f,sizeof f); insert( make_pair(s,0) ); f[s][0]=0; while(top) { x=heap[1];pop(); for(i=head[x.first];i;i=table[i].next) { if( f[x.first][x.second]+table[i].f<f[table[i].to][x.second] ) { f[table[i].to][x.second]=f[x.first][x.second]+table[i].f; if(!pos[table[i].to][x.second]) insert( make_pair(table[i].to,x.second) ); else push_up( pos[table[i].to][x.second] ); } if( x.second<k && f[x.first][x.second]<f[table[i].to][x.second+1] ) { f[table[i].to][x.second+1]=f[x.first][x.second]; if(!pos[table[i].to][x.second+1]) insert( make_pair(table[i].to,x.second+1) ); else push_up( pos[table[i].to][x.second+1] ); } } } for(i=0;i<=k;i++) ans=min(ans,f[t][i]);}void add(int x,int y,int z){ table[++tot].to=y; table[tot].f=z; table[tot].next=head[x]; head[x]=tot;}int main(){ int i,x,y,z; cin>>n>>m>>k>>s>>t;s++;t++; for(i=1;i<=m;i++) scanf("%d%d%d",&x,&y,&z),x++,y++,add(x,y,z),add(y,x,z); SPFA(); cout<<ans<<endl;}
0 0
- BZOJ 2763 JLOI2011 飞行路线 分层图+堆优化SPFA
- poj 2763: [JLOI2011]飞行路线(spfa分层图最短路)
- bzoj 2763 [JLOI2011]飞行路线 Dijikstra 分层
- BZOJ[2763][JLOI2011]飞行路线 spfa
- BZOJ 2763: [JLOI2011]飞行路线(分层图最短路)
- bzoj 2763: [JLOI2011]飞行路线 分层图最短路
- BZOJ 2763: [JLOI2011]飞行路线 分层图最短路
- (bzoj 2763 [JLOI2011]飞行路线)<分层图>
- BZOJ 2763 飞行路线(spfa+分层图)
- 【BZOJ 2763 JLOI 2011】飞行路线 (SPFA+分层图)
- bzoj 2763 JLOI 2011 飞行路线 分层图+spfa
- 【bzoj 2763】T13 飞行路线(Spfa+分层图)
- 【bzoj 2763】2763: [JLOI2011]飞行路线 spfa二维
- bzoj 2763 [JLOI2011] 飞行路线 两维spfa
- BZOJ 2763: [JLOI2011]飞行路线
- bzoj 2763 [JLOI2011]飞行路线
- BZOJ 2763 [JLOI2011]飞行路线
- BZOJ 2763 [JLOI2011]飞行路线
- 在Python上使用Berkeley DB ——bsddb
- 并发编程--合并任务的结果
- 安装jdk8 for Linux
- 计算机图形学和OpenGL(二)坐标系和绘制点线函数
- function类型
- BZOJ 2763 JLOI2011 飞行路线 分层图+堆优化SPFA
- 多继承(虚继承)派生类对象内存结构
- 关于傅里叶的一些东西(整理)
- response通过writer输出数据
- PHP微信公众开发笔记(五)
- 设计模式之-观察者模式(Observer Design Pattern)
- STM32学习笔记——流水灯
- 笔记12 继承extends
- poj 1001(高精度)