Sightseeing

Time Limit: 5000ms
Memory Limit: 65536KB

This problem will be judged on PKU. Original ID: 4046
64-bit integer IO format: %lld      Java class name: Main

 
CC and MM arrive at a beautiful city for sightseeing. They have found a map of the city on the internet to help them find some places to have meals. They like buffet restaurants (self-service restaurants) and there are n such restaurants and m roads. All restaurants are numbered from 1 to n. Each road connects two different restaurants. They know the price of every restaurant. They go by taxi and they know the taxi fee of each road.
Now they have Q plans. In each plan, they want to start from a given restaurant, pass none or some restaurants and stop at another given restaurant. They will have a meal at one of those restaurants. CC does not want to lose face, so he will definitely choose the most expensive one among the restaurants which they will pass (including the starting one and the stopping one). But CC also wants to save money, so he want you to help him figure out the minimum cost path for each plan.
 

Input

There are multiple test cases in the input. 
For each test case, the first line contains two integers, n, m(1<=n<=1000, 1<=m<=20000),meaning that there are n restaurants and m roads.
The second line contains n integers indicating the price of n restaurant. All integers are smaller than 2×109.
The next m lines, each contains three integers: x, y and  z(1<=x, y <=n, 1<=z<=2×109), meaning that there is a road between x and y, and the taxi fee of this road is z.
Then a single line containing an integer Q follows, meaning that there are Q plans (1<=Q<=20000).
The next Q lines, each contains two integers: s and t (1<=s, t <= n) indicating the starting restaurant and stopping restaurant of each plan.
The input ends with n = 0 and m = 0.
 

Output

For each plan, print the  minimum cost in a line. If there is no path from the starting restaurant to the stopping restaurant, just print -1 instead.
Print a blank line after each test case.
 

Sample Input

6 7
1 2 3 4 5 6
1 2 1
2 3 2
3 4 3
4 5 4
1 5 5
2 5 2
1 4 3
5
1 4
2 3
1 5
3 5
1 6
2 1
10 20
1 2 5
1
1 2
0 0

Sample Output

7
5
8
9
-1 25

Source

 
解题:最短路
 
 #include <cstdio>
#include <queue>
#include <iostream>
#include <cstring>
#define pil pair<LL,int>
using namespace std;
typedef long long LL;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = ;
int head[maxn],tot,n,m,q,p[maxn],from[maxn*],to[maxn*];
bool done[maxn];
LL d[maxn],ans[maxn*];
struct arc {
int to,w,next;
arc(int x = ,int y = ,int z = -) {
to = x;
w = y;
next = z;
}
} e[];
void add(int u,int v,int w) {
e[tot] = arc(v,w,head[u]);
head[u] = tot++;
}
priority_queue<pil,vector<pil >,greater<pil > >qq;
void dijkstra(int s){
while(!qq.empty()) qq.pop();
for(int i = ; i <= n; ++i){
d[i] = INF;
done[i] = false;
}
d[s] = ;
qq.push(pil(,s));
while(!qq.empty()){
int u = qq.top().second;
qq.pop();
if(done[u]) continue;
done[u] = true;
for(int i = head[u]; ~i; i = e[i].next){
if(p[e[i].to] <= p[s] && !done[e[i].to] && d[e[i].to] > d[u] + e[i].w){
d[e[i].to] = d[u] + e[i].w;
qq.push(pil(d[e[i].to],e[i].to));
}
}
}
for(int i = ; i < q; ++i)
if(d[from[i]] < INF && d[to[i]] < INF)
ans[i] = min(ans[i],d[from[i]] + d[to[i]] + p[s]);
}
int main() {
int u,v,w;
while(scanf("%d%d",&n,&m),n||m) {
for(int i = ; i <= n; ++i)
scanf("%d",p+i);
memset(head,-,sizeof head);
tot = ;
while(m--){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
scanf("%d",&q);
for(int i = ; i < q; ++i){
scanf("%d%d",from+i,to+i);
ans[i] = INF;
}
for(int i = ; i <= n; ++i) dijkstra(i);
for(int i = ; i < q; ++i)
printf("%I64d\n",ans[i] == INF?-:ans[i]);
puts("");
}
return ;
}

POJ 4046 Sightseeing的更多相关文章

  1. POJ 4046 Sightseeing 枚举+最短路 好题

    有n个节点的m条无向边的图,节点编号为1~n 然后有点权和边权,给出q个询问,每一个询问给出2点u,v 输出u,v的最短距离 这里的最短距离规定为: u到v的路径的所有边权+u到v路径上最大的一个点权 ...

  2. POJ 1637 Sightseeing tour(最大流)

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

  3. POJ 1637 Sightseeing tour (混合图欧拉路判定)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6986   Accepted: 2901 ...

  4. poj 3463 Sightseeing( 最短路与次短路)

    http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  5. POJ 1637 - Sightseeing tour - [最大流解决混合图欧拉回路]

    嗯,这是我上一篇文章说的那本宝典的第二题,我只想说,真TM是本宝典……做的我又痛苦又激动……(我感觉ACM的日常尽在这张表情中了) 题目链接:http://poj.org/problem?id=163 ...

  6. POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】

    题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total ...

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

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

  8. POJ - 3463 Sightseeing 最短路计数+次短路计数

    F - Sightseeing 传送门: POJ - 3463 分析 一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数. ...

  9. POJ 1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9276   Accepted: 3924 ...

随机推荐

  1. android按钮被点击文字颜色变化效果

    有的时候做应用需要点击按钮时文字颜色也跟着变,松开后又还原,目前发现两种解决方案:第一用图片,如果出现的地方比较多,那么图片的量就相当可观:第二,也就是本文讲到的.废话少说,先贴图片,再上代码. 正常 ...

  2. Codeforces--630I--Parking Lot(规律)

     I - Parking Lot Crawling in process... Crawling failed Time Limit:500MS     Memory Limit:65536KB  ...

  3. RCF:一个相当不错的C++分布式RPC框架

    RCF(远程调用框架)是一个可以移植的C++进程间通信框架,使用C++语言特性,提供了一个简单高效的编写分布式C++软件的途径.RCF利用编译时多态清晰分开了接口和实现. 和传统的RPC框架如CORB ...

  4. string 类型的翻转

    #include <string>#include <iostream>#include <stack> int main() { std::string str= ...

  5. [Apple开发者帐户帮助]一、开始(1)关于您的开发者帐户

    Apple开发人员网站提供了为Apple平台制作出色应用所需的工具和信息.如果您不熟悉Apple平台上的开发,可以免费使用.只需接受Apple开发者协议,即可为您创建一个帐户.使用此帐户下载测试版软件 ...

  6. Docker For MYSQL 8.0 特别注意修复数据库新的验证方式

    从Docker登录MySQL的终端 docker exec -it wordpress-mysql /bin/bash 登录数据库 mysql -u root -p 使用MYSQL数据库 use my ...

  7. Python 29 异常处理, 元类

    所学内容 异常处理(常用) AttributeError ··························  试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError ··· ...

  8. 网络简要<入门篇>对应配置代码

    交换机的配置 (1)交换机的模式: switch>    用户模式,可以查看设备的部分内容 SW-3ceng>enable SW-3ceng#          进入特权模式,可以查看更多 ...

  9. POJ 2688 Cleaning Robot

    题意: 给你一个n*m的图.你从'o'点出发,只能走路(图中的'.')不能穿墙(图中的'x'),去捡垃圾(图中的' * ')问最少走多少步能捡完所有垃圾,如有垃圾捡不了,输出-1. 思路: 有两个思路 ...

  10. Spark Streaming概述

    Spark Streaming是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力. 其中包括:资源管理框架,Apache YARN.Apache Mesos:基于内存的 ...