有n个节点的m条无向边的图,节点编号为1~n

然后有点权和边权,给出q个询问,每一个询问给出2点u,v

输出u,v的最短距离

这里的最短距离规定为:

u到v的路径的所有边权+u到v路径上最大的一个点权的和(点权也可以是u,v)

n<=1000

m<=20000

Q<=20000

时限:5000ms

没有点权的话,好处理

加了点权呢?

我们可以先枚举n个节点,跑n次spfa,当枚举节点u时,我们默认节点u是所有路径上点权最大的一个点

即我们枚举节点u时,我们先把点权比u大的节点删除了,在剩下的图跑spfa

但实际上只要在spfa时加一句判断即可,并不用真的去重建图

这样对于每一个询问,我们只要枚举点权最大的点就可以了,每一个询问是Q(n)

ans=min(dis[i][u]+dis[i][v]+cost[i])

但是这样我还是tle了, 因为这样需要开一个2维数组

dis[i][j]表示以第i个点为起点,到达节点j的短路

最后选择先存下所有询问,离线更新ans,在spfa的同时枚举更新

为什么这样就可以了呢?

因为一维数组比二维数组快很多。

从这道题:

1.当点权和边权混在一起比较难求的时候,我们可以先假设点权最大,分离出点权和边权,再枚举每一个点,就可以了

不止这个, 枚举的思想在很多时候都很好用

2.用stl的queue,时间是4000ms左右,用自己的队列,时间是3500左右,快了半秒

3.一维数组的访问比二维数组快很多

4.做题的时候要注意,循环的时候的终止条件,是到n? m? 还是Q?这个写错就wa了,又难发现

 #include<cstdio>
#include<cstring>
#include<algorithm> #define ll long long using namespace std; const int maxn=;
const int maxm=+;
const ll inf=0x3f3f3f3f3f3f3f3f; struct Edge
{
int to,next;
ll w;
};
Edge edge[maxm<<];
int head[maxn];
int tot;
int que[maxm<<];
ll ans[maxm];
int a[maxm];
int b[maxm];
ll dis[maxn];
ll cost[maxn];
bool vis[maxn];
int n,Q; void init()
{
memset(head,-,sizeof head);
tot=;
} void addedge(int u,int v,ll w)
{
edge[tot].to=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
} void solve(); int main()
{
int m;
while(scanf("%d %d",&n,&m)){
if(!n&&!m)
break; for(int i=;i<=n;i++)
scanf("%lld",&cost[i]);
int u,v;
ll w;
init();
for(int i=;i<=m;i++){
scanf("%d %d %lld",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
scanf("%d",&Q);
for(int i=;i<=Q;i++){
scanf("%d %d",&a[i],&b[i]);
} solve();
}
return ;
} void spfa(int srt)
{
for(int i=;i<=n;i++)
dis[i]=inf;
dis[srt]=;
memset(vis,false,sizeof vis);
int l=,r=;
que[r++]=srt;
vis[srt]=true;
while(l<r){
int u=que[l++];
vis[u]=false;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
ll w=edge[i].w;
if(cost[v]>cost[srt])
continue;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v]){
que[r++]=v;
vis[v]=true;
}
}
}
}
for(int i=;i<=Q;i++){
if(dis[a[i]]==inf||dis[b[i]]==inf)
continue;
if(dis[a[i]]+dis[b[i]]+cost[srt]<ans[i])
ans[i]=dis[a[i]]+dis[b[i]]+cost[srt];
}
} void solve()
{
for(int i=;i<=Q;i++)
ans[i]=inf;
for(int i=;i<=n;i++){
spfa(i);
} for(int i=;i<=Q;i++){
if(ans[i]==inf)
printf("-1\n");
else
printf("%lld\n",ans[i]);
}
printf("\n"); return ;
}

POJ 4046 Sightseeing 枚举+最短路 好题的更多相关文章

  1. POJ 3463 Sightseeing (次短路经数)

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions:10005   Accepted: 3523 Descr ...

  2. hdu 2363(枚举+最短路好题)

    Cycling Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  3. POJ 4046 Sightseeing

    Sightseeing Time Limit: 5000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID ...

  4. POJ 3463 Sightseeing 【最短路与次短路】

    题目 Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the ...

  5. poj1511/zoj2008 Invitation Cards(最短路模板题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Invitation Cards Time Limit: 5 Seconds    ...

  6. POJ 1637 Sightseeing tour(最大流)

    POJ 1637 Sightseeing tour 题目链接 题意:给一些有向边一些无向边,问能否把无向边定向之后确定一个欧拉回路 思路:这题的模型很的巧妙,转一个http://blog.csdn.n ...

  7. POJ 3621 Sightseeing Cows(最优比例环+SPFA检测)

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10306   Accepted: 3519 ...

  8. poj 1873 凸包+枚举

    The Fortified Forest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6198   Accepted: 1 ...

  9. HDU 5521.Meeting 最短路模板题

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

随机推荐

  1. HDU-4276 The Ghost Blows Light (树形DP+背包)

    题目大意:在一个n个节点的树形迷宫中,1为起点,n为出口.每个节点上有一定价值的珠宝,在节点之间移动的时间已知,问在能走出迷宫的前提下并且不超过m的时间内能收集的最多珠宝是多少? 题目分析:在树上,从 ...

  2. hdu1078  记忆化搜索(DP+DFS)

    题意:一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子上的数必须比上一个走的格子的数大,问最大的路径和. 我一开始的思路是,或许是普通的最大路径和,只 ...

  3. 继承:《原型和原型链(prototype 属性使您有能力向对象添加属性和方法。)》

    二. 原型对象   在JavaScript 中,每当定义一个对象(函数)时候,对象中都会包含一些预定义的属性.其中函数对象的一个属性就是原型对象 prototype.注:普通对象没有prototype ...

  4. C#加载dll 创建类对象

    //加载dll 创建类对象string sqlightAssembly = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "syst ...

  5. 网页上下载文件提示框(vb.net)

    Public Sub downLoadFile(ByVal fPath As String) Dim fileInfo As System.IO.FileInfo = New System.IO.Fi ...

  6. ABBYY导出结果为PDF注意事项

    使用ABBYY FineReader Pro for Mac OCR文字识别软件识别文档时,可以将已识别的文本保存到文件中,还可以通过电子邮件发送已识别的文本,只要输出格式受FineReader支持. ...

  7. Web前端开发笔试&面试_04

    >>XDL: 1.在CSS中,选择器的优先级?(如important,id,class 这些……) 2.如何消除行内间隙? Inline-block 3. 如何清除浮动? —— 4. CS ...

  8. 可视化SNV安装

    以前也安装过非图形化的SVN SERVER,但大多都需要比较复杂的配置,而且操作不太友好,所以其拥有可视化功能就比较重要了. 好了,开始干活吧. 说明:测试机为开发爬虫用的服务器,配置不高 准备工作: ...

  9. SQL集合运算参考及案例(一):列值分组累计求和

    概述 目前企业应用系统使用的大多数据库都是关系型数据库,关系数据库依赖的理论就是针对集合运算的关系代数.关系代数是一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式.不过我们在工作中发现,很多人 ...

  10. SqlServer性能急剧下降,查看所有会话的状态及等待类型---Latch_Ex

    当某个数据库文件空间用尽,做自动增长的时候,同一时间点只能有一个用户人员可以做文件自动增长动作,其他任务必须等待,此时会出现Latch资源的等待.使用sp_helpdb查看业务数据库时发现:该数据库设 ...