【JZOJ 4489】【GDOI 2016 Day2】第一题 SigemaGO
2016-06-13 20:04
134 查看
Description
Analysis
这题在GDOI上想到了,可是只有20,so sad对于那个插近道,只需要做lim次最短路即可。把图分层,插近道相当于从上一层的图走到这一层的图。
当然,这一层本身的最短路也要跑的。
SP(b)FA的时间复杂度O(lim∗n∗一个神奇的常数),dijkstra的是O(lim∗n∗log2n)
Code
#include<cstdio> #include<queue> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define efo(i,v) for(int i=last[v];i;i=next[i]) using namespace std; const int N=10010,M=50010,INF=2139062143; int n,m,l,tot,to[M],wei[M],next[M],last ,dis[6] ; bool bz ; queue<int> q; struct edge { int x,y,z; }b[M]; bool cmp(edge a,edge b){return a.x<b.x;} void link(int u,int v,int w) { to[++tot]=v,wei[tot]=w,next[tot]=last[u],last[u]=tot; } void spfa(int k) { bz[1]=1; memset(dis[k],127,sizeof(dis[k])); dis[k][1]=0; q.push(1); while(!q.empty()) { int x=q.front();q.pop(); bz[x]=0; efo(i,x) { int y=to[i]; if(dis[k][x]+wei[i]<dis[k][y]) { dis[k][y]=dis[k][x]+wei[i]; if(!bz[y]) { bz[y]=1; q.push(y); } } if(k>0) efo(j,y) { int z=to[j]; if(dis[k-1][x]+l<dis[k][z]) { dis[k][z]=dis[k-1][x]+l; if(!bz[z]) { bz[z]=1; q.push(z); } } } } } } int main() { freopen("sigemago.in","r",stdin); freopen("sigemago.out","w",stdout); int lim,u,v,w; scanf("%d %d %d %d",&n,&m,&l,&lim); fo(i,1,m) { scanf("%d %d %d",&u,&v,&w); link(u,v,w); } fo(i,0,lim) spfa(i); printf("%d\n",dis[lim] ==INF?-1:dis[lim] ); fclose(stdin);fclose(stdout); return 0; }
相关文章推荐
- 【GDOI 2016 Day2】SigemaGO
- golang学习之闭包
- web服务器之mongoose:简介
- web服务器之mongoose:工作模型
- django模板使用心得
- Google式用户体验的十大内在原则
- Google软件测试
- django安装与卸载
- goLang 纳秒转 毫秒 转 英文时间格式
- Google TensorFlow学习笔记之Deep MNIST for Experts
- Google-hosts
- 4.django笔记之admin
- How to write a good bug report
- 地图瓦片相关学习总结
- golang: Baa框架文章列表
- windows中Django安装教程
- golang map 用原生range遍历不能保证顺序输出
- Googel 浏览器 模拟发送请求工具--Advanced REST Client
- GO语言学习(二)
- 问道术业:Google软件测试