CS 400 Late Edges BFS+优先队列
来源:互联网 发布:灯火阑珊网络电视直播 编辑:程序博客网 时间:2024/06/05 10:51
题意:n点m条边的图,第i条边[a[i],b[i],c[i]]]表示a[i]-b[i]这条边在时刻c[i]以后才能使用.
n,m<=5e3.c[i]<=1e9.经过每条边的花费1秒,每一时刻必须移动,问从1出发到达n需要的最短时间?
不考虑边生成的时间 就是一个简单的BFS.
因为可以重复走边,如果在x时刻的到达顶点u 则在x+2k时刻同样能达到顶点u.
所以如果u-v边还没开通 则可以来回走 直到u-v边开通为止.此时BFS产生的距离不是递增的 用优先队列维护一下 每次弹出从最小的开始搜索即可.
对此求出奇数和偶数时刻到达点u的最短时间. 每个点最多进入队列m次 O(n*m).
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int> ii;const int N=2e5+5;int n,m,dist[N][2];vector<ii> e[N];priority_queue<ii> q;//time,node_numbool upd(int &x,int y){ if(y==-1) return false; if(x==-1||x>y) { x=y; return true; } return false;}int main(){ int u,v,t; cin>>n>>m; for(int i=1;i<=m;i++) { cin>>u>>v>>t; e[u].push_back(ii(v,t)); e[v].push_back(ii(u,t)); } memset(dist,-1,sizeof(dist)); dist[1][0]=0; q.push(ii(0,1)); while(!q.empty()) { ii tmp=q.top(); q.pop(); int u=tmp.second,d=-tmp.first,y=0; if(u>n) u-=n,y=1; for(int i=0;i<e[u].size();i++) { ii p=e[u][i]; int to=p.first,d2; if(d>=p.second) d2=d+1; else d2=p.second+1+((p.second%2==d%2)?0:1); if(upd(dist[to][d2%2],d2)) q.push(ii(-d2,to+(d2%2?n:0))); } } int res=-1; upd(res,dist[n][0]); upd(res,dist[n][1]); cout<<res<<endl; return 0;}
阅读全文
0 0
- CS 400 Late Edges BFS+优先队列
- 优先队列+BFS
- hdu1242优先队列BFS
- HDU4198-BFS+优先队列
- acmdream1191 bfs+优先队列
- Hdu2822Dogs bfs+优先队列
- hdu4198-优先队列+bfs
- BFS+队列优先
- 优先队列+BFS
- hdu5040 优先队列+bfs
- HDU1026 bfs+优先队列
- hdu1071Nightmare(BFS+优先队列)
- HDU2026 BFS+优先队列
- HDOJ1026 优先队列bfs
- HDU1242 BFS+优先队列
- BFS-优先队列
- 优先队列+bfs 模板
- hdu1242 BFS+优先队列
- TOMCAT内核之旅--连接器(Connector)--学习心得(三)
- html&css----------列表、表格和表单(11/4)
- Traceback (most recent call last): File "../zubax_chibios/tools/make_boot_descriptor.py", line 251
- 桥接和hostonly虚拟网络配置
- HDU-2006(求奇数的乘积)
- CS 400 Late Edges BFS+优先队列
- 用java绘制登录时验证码
- Not Found The requested URL /phpMyAdmin/index.php was not found on this server.解决办法
- CAS单点登录-多属性返回(十六)
- 习题3.3
- Linux基础操作-1.man_page
- HDU-2007(平方和与立方和)
- 代码行数统计器
- 习题5.1