BZOJ 2100 Apple Delivery
2016-05-24 19:12
232 查看
SPFA双端队列优化。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<deque> #define maxv 100050 #define maxe 400050 #define inf 0x7f7f7f7f using namespace std; struct edge { int v,w,nxt; }e[maxe]; int n,m,s,t1,t2,nume=0,g[maxv],dis[maxv],a,b,c,ans=inf; bool vis[maxv]; deque <int> q; void addedge(int u,int v,int w) { e[++nume].v=v; e[nume].w=w; e[nume].nxt=g[u]; g[u]=nume; } void spfa(int x) { while (!q.empty()) q.pop_front(); memset(vis,false,sizeof(vis)); fill(dis+1,dis+n+1,inf); q.push_front(x);vis[x]=true;dis[x]=0; while (!q.empty()) { int head=q.front();q.pop_front();vis[head]=false; for (int i=g[head];i;i=e[i].nxt) { int v=e[i].v; if (dis[v]>dis[head]+e[i].w) { dis[v]=dis[head]+e[i].w; if (!vis[v]) { if (q.empty()) q.push_front(v); else if (dis[v]<dis[q.front()]) q.push_front(v); else q.push_back(v); } } } } } int main() { scanf("%d%d%d%d%d",&m,&n,&s,&t1,&t2); for (int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); addedge(a,b,c); addedge(b,a,c); } spfa(t1); ans=dis[s]+dis[t2]; spfa(t2); ans=min(ans,dis[s]+dis[t1]); printf("%d\n",ans); return 0; }
相关文章推荐
- Ionic 常见问题及解决方案——留着给自己解解惑~~
- Android减少内存泄漏之静态内部类的使用
- android studio没有创建Android项目的选项,打开已有android studio项目无法运行的问题
- iOS中创建单例的两种方式
- Android20之外部存储
- 基于Cordova的android项目入门
- 【Android基础】一
- Android中不同Activity之间的数据传递
- Android应用启动优化:一种DelayLoad的实现和原理
- 微信网页授权
- 微信开发内置浏览器JS自动关闭当前页面回到微信对话窗口
- HoloLens开发手记 - Unity之语音输入
- (4.6.12)AndroidManifest.xml常用属性大全[进行中]
- Android通用流行框架大全
- iOS屏幕强制旋转
- 接入指南
- Android屏幕适配全攻略
- VC++之 CreateEvent和SetEvent及WaitForSingleObject的用法
- iOS开发中,实现两个控制器之间数据的双向传递
- 安卓实战之如何快速搭建app架构