金华邀请赛B题poj 4046(spfa求最短路)
来源:互联网 发布:zip解压软件下载mac 编辑:程序博客网 时间:2024/05/22 03:28
题目大意:给定一个无向图,边上有权值,顶点也有权值。有q次询问,每次询问两个顶点,求这两个顶点之间(的路加上这条路上的最大的顶点权值)的最小值。
思路:枚举点,然后求该点到a,b的最小距离。spfa的期望复杂度是O(ke),k一般在2左右,然后,就可以在这道题目大显身手了,这题时限非常紧,一般都是几千毫秒过的,时限只给了5000MS。所以,裸的spfa和暴力询问还是会超时。
关键方程:(start为你枚举的点) if(val[v]<=val[start]&&dis[v]>dis[top]+edge[i].w)
if(dis[u]!=inf&&dis[v]!=inf&&ans[i]>dis[u]+dis[v]+val[start])
ans[i]=dis[u]+dis[v]+val[start];
#include <iostream>#include <cstring>#include <vector>#include <cstdio>#define MAXN 1005#define MAXM 40005#define inf 10000000000007LLusing namespace std;int head[MAXN];int cnt=0;int n,m;long long val[MAXN];int qua[MAXM],qub[MAXM];int q;long long ans[MAXM];int vis[MAXN];long long dis[MAXN];int mystack[MAXM*5];struct Node{ int v; long long w; int next;}edge[MAXM];void init(){ cnt=0; memset(head,-1,sizeof(head));}void addedge(int u,int v,long long w){ edge[cnt].v=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++;}void spfa(int start){ for(int i=0;i<=n+3;i++) vis[i]=0,dis[i]=inf; vis[start]=1; dis[start]=0; int h=0,r=0; mystack[r++]=start; while(h<r) { int top=mystack[h++]; vis[top]=0; for(int i=head[top];i!=-1;i=edge[i].next) { int v=edge[i].v; if(val[v]<=val[start]&&dis[v]>dis[top]+edge[i].w) { dis[v]=dis[top]+edge[i].w; if(!vis[v]) { mystack[r++]=v; vis[v]=1; } } } } for(int i=1;i<=q;i++) { int u=qua[i]; int v=qub[i]; if(dis[u]!=inf&&dis[v]!=inf&&ans[i]>dis[u]+dis[v]+val[start]) ans[i]=dis[u]+dis[v]+val[start]; }}int main(){ int u,v; __int64 w; while(scanf("%d%d",&n,&m)==2) { if(n==0&&m==0)break; init(); for(int i=1;i<=n;i++) scanf("%I64d",&val[i]); for(int i=1;i<=m;i++) { scanf("%d%d%I64d",&u,&v,&w); addedge(u,v,w); addedge(v,u,w); } scanf("%d",&q); for(int i=1;i<=q;i++) scanf("%d%d",&qua[i],&qub[i]),ans[i]=inf; for(int i=1;i<=n;i++) spfa(i); for(int i=1;i<=q;i++) { if(ans[i]==inf) printf("-1\n"); else printf("%I64d\n",ans[i]); } puts(""); } return 0;}
- 金华邀请赛B题poj 4046(spfa求最短路)
- 金华邀请赛 B题 poj 4045
- POJ 4045 Power Station 2012金华邀请赛B题(树形DP)
- POJ 1511 Invitation Cards 求来回最短路(spfa)
- poj 3259 Wormholes (spfa求最短路)
- POJ 4049 金华赛区邀请赛F题
- POJ 4052 金华邀请赛I题
- spfa求最短路模板(邻接矩阵)
- POJ 4046 - Sightseeing(最短路‘spfa)
- poj 3268 (最短路 spfa)
- poj 1158 TRAFFIC LIGHTS spfa求最短路
- poj 3259 Wormholes 【spfa判负环---求最短路】
- poj-3268 Silver Cow Party (最短路-spfa-求到同一起点,同一终点的最短路)
- [HDU 1548] SPFA 最短路权值设为1, 然后求a--b的最短路
- 2013成都邀请赛J题||HDU4725 The Shortest Path in Nya Graph(spfa+slf优化最短路)
- Poj 4047 Garden /2012金华邀请赛D题(线段树)
- poj 4048 计算几何(线段相交)金华邀请赛 E题
- poj 4047金华邀请赛 D题 (线段树+lazy优化)
- 已知二叉树后序遍历序列是DBCEFGHA,中序遍历序列EDCBAHFG,它的前序遍历的序列是?
- Extjs-表格 Ext.grid.GridPanel
- Python对字母字符(串)中大小写转换函数--upper() 和 lower()
- Xcode快捷键
- linux内存管理之伙伴系统(内存分配)
- 金华邀请赛B题poj 4046(spfa求最短路)
- 数据区,代码区,堆栈区,操作系统堆栈
- 另类的旁注方式 seesion欺骗+dns欺骗 登陆 -> 注册 -> 搜索 分享
- <A HREF="" target="_BLANK">打开的新窗口大小的控制
- Apache多路处理模块(MPM)之prefork和worker的配置
- java(JDBC连接数据库)[完整版封装]
- Extjs-数据存储与传输-记录集 Ext.data.Record
- c# datatable具体用法
- ASP.NET全球化与本地化 c#多语言的支持