POJ 4046 Sightseeing 枚举+最短路 好题
有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 枚举+最短路 好题的更多相关文章
- POJ 3463 Sightseeing (次短路经数)
Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissions:10005 Accepted: 3523 Descr ...
- hdu 2363(枚举+最短路好题)
Cycling Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- POJ 4046 Sightseeing
Sightseeing Time Limit: 5000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID ...
- POJ 3463 Sightseeing 【最短路与次短路】
题目 Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the ...
- poj1511/zoj2008 Invitation Cards(最短路模板题)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Invitation Cards Time Limit: 5 Seconds ...
- POJ 1637 Sightseeing tour(最大流)
POJ 1637 Sightseeing tour 题目链接 题意:给一些有向边一些无向边,问能否把无向边定向之后确定一个欧拉回路 思路:这题的模型很的巧妙,转一个http://blog.csdn.n ...
- POJ 3621 Sightseeing Cows(最优比例环+SPFA检测)
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10306 Accepted: 3519 ...
- poj 1873 凸包+枚举
The Fortified Forest Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6198 Accepted: 1 ...
- HDU 5521.Meeting 最短路模板题
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
随机推荐
- hive 常见面试题
(笔者自己做记录) 1.Hive内外部表的区别删除表是否影响外部数据2.Hive如何做到权限管理hive下可以修改配置后创建用户管理,但是仅仅是为了防止误操而已,如果要真的为了安全操作建议使用 Ker ...
- Metasploit连接postgres数据库
操作环境为Kali虚拟机 root@kali:~# apt-get install postgresql 启动服务 root@kali:~# service postgresql start [ ok ...
- 英语语法最终珍藏版笔记- 21it 用法小结
it 用法小结 it 在英语中的意思较多,用法较广,现总结如下. 一.it作句子的真正主语 1.it 指前面已经提到过的人或事物,有时指心目中的或成为问题的人或事物,作真正主语. 例如: What’s ...
- spring之bean的作用域scope的值的详解
今天研究了一下scope的作用域.默认是单例模式,即 scope="singleton".另外scope还有prototype.request.session.global ses ...
- SPL迭代器的工作和代理模式OuterIterator
1.迭代器通过foreach语言结构来实现迭代,没有实现迭代器接口(Iterator)的普通对象使用foreach结构会遍历公共属性. 2.OuterIterator用于做为实际迭代器的代理(即代理模 ...
- solr 主从模式和solrcloud集群模式
主从模式 主节点有单点故障问题:没有主从自动切换,没有failover,主机down掉了的话,整个数据变成只读.并且需要一台机单独做索引,浪费资源,所有数据都需要在这台机器上单独存在一份,索引变化较大 ...
- CSS3 必须要知道的10 个顶级命令
来源:http://www.cnblogs.com/damonlan/archive/2012/04/23/2465569.html 作者:浪迹天涯 1.边框圆角(Border Radiuas) 这个 ...
- c语言编程中%g是什么格式
%g用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的0.即%g是根据结果自动选择科学记数法还是一般的小数记数法 printf("%g\n& ...
- wikioi 1204 寻找子串位置
/*======================================================================== 1204 寻找子串位置 题目描述 Descript ...
- JSP页面中<%! %>和<% %>的区别
JSP声明语句:<%!声明语句%>,通常声明全局变量.常量.方法.类JSP Scriptlet:<%java代码%>,其中可包含局部变量.java语句JSP表达式:<%= ...