题目描述

精灵王国有N座美丽的城市,它们以一个环形排列在Bzeroth的大陆上。其中第i座城市到第i+1座城市花费的时间为d[i]。特别地,第N座城市到第1座城市花费的时间为d[N]。这些道路都是双向的。

另外,精灵们在数千年的时间里建造了M座传送门,第i座传送门连接了城市u[i]与城市v[i],并且需要花费w[i]的时间通过(可能有两座传送门连接了同一对城市,也有可能一座传送门连接了相同的两座城市)。这些传送门都是双向的。

小S是精灵王国交通部部长,她的职责是为精灵女王设计每年的巡查路线。每次陛下会从某一个城市到达另一个城市,沿路调查每个城市的治理情况,她需要找出一条用时最短的路线。

输入描述:

第一行为2个整数N、M。
第二行为N个正整数d[i]。
接下来M行每行三个正整数u[i]、v[i]、w[i]。
第M+3行为一个正整数Q,表示需要设计路线的次数。
接下来Q行每行两个正整数x、y,表示一次从城市x到城市y的旅行。

输出描述:

Q行每行一个正整数表示该次旅行的最短时间。
示例1

输入

4 1
1 2 3 6
1 3 2
5
1 2
1 4
1 3
2 3
4 3

输出

1
5
2
2
3

备注:

1 ≤ N、Q ≤ 52501,1 ≤ M ≤ 20,1 ≤ u[i]、v[i]、x、y ≤ N,1 ≤ d[i]、w[i] ≤ 2^(30)

思路:

观察数据范围,M很小,只有20,很容易把人往状压压缩上去带,其实并无相关性,我们只要找到问题的关键即可。

首先考虑,如果M为0的话,我们的图就是一个环,如果图只是一个环的话,那么从x到y的最短路就只有两种走法,取最小即可。

如果M>0的话,我们可能会存在从x到y的捷径,但是具体我们会经过哪些多出来的边我们并不要考虑,我们只要考虑从x到y的最短路,是否会经过这种边即可。

那么从x到y的最短路就只有两种情况:

①按照顺时针或者逆时针从x走到y

②在上述走法的基础上,再走至少一个传送门。

那么我们不妨做M*2个单源最短路,我们拿传送门的端点作为起点,去做单源最短路,那么对于②的情况,我们经过传送门了的情况,就是到了某个传送门端点的情况。

那么此情况,就相当于取Min(dist【传送门某端点v】【x】+dist【传送门某端点v】【y】);

对于dist数组的开取,离散化一下点就行了。

Ac代码:

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define ll long long int
struct node
{ll from;ll to;ll next;ll w;
}e[1500000];
ll cont,n,m;
ll head[105000];
ll vis[105000];
ll dist[60][105000];
void add(ll from,ll to,ll w)
{e[cont].to=to;e[cont].w=w;e[cont].next=head[from];head[from]=cont++;
}
void SPFA(ll u,ll d)
{queue<ll>s;memset(vis,0,sizeof(vis));for(ll i=1;i<=n;i++)dist[d][i]=1000000000000000000;s.push(u);dist[d][u]=0;while(!s.empty()){ll u=s.front();s.pop();vis[u]=0;for(ll i=head[u];i!=-1;i=e[i].next){ll v=e[i].to;ll w=e[i].w;if(dist[d][v]>dist[d][u]+w){dist[d][v]=dist[d][u]+w;if(vis[v]==0){vis[v]=1;s.push(v);}}}}
}
ll dd[105000];
int main()
{while(~scanf("%lld%lld",&n,&m)){memset(dd,0,sizeof(dd));ll summ=0;cont=0;memset(head,-1,sizeof(head));for(ll i=1;i<=n;i++){ll len;scanf("%lld",&len);if(i!=n)add(i,i+1,len),add(i+1,i,len);else add(1,n,len),add(n,1,len);summ+=len;dd[i]=len+dd[i-1];}ll cnt=0;map<ll,ll>s;vector<ll>sou;for(ll i=1;i<=m;i++){ll x,y,w;scanf("%lld%lld%lld",&x,&y,&w);if(s[x]==0)s[x]=++cnt;if(s[y]==0)s[y]=++cnt;sou.push_back(x);sou.push_back(y);add(x,y,w);add(y,x,w);}for(ll i=0;i<sou.size();i++){ll sss=sou[i];SPFA(sss,s[sss]);}ll q;scanf("%lld",&q);for(ll i=1;i<=q;i++){ll ans=1000000000000000000;ll x,y;scanf("%lld%lld",&x,&y);if(x>y)swap(x,y);for(ll j=0;j<sou.size();j++){ans=min(ans,dist[s[sou[j]]][x]+dist[s[sou[j]]][y]);}ans=min(ans,dd[y-1]-dd[x-1]);ans=min(ans,summ-(dd[y-1]-dd[x-1]));printf("%lld\n",ans);}}
}

Wannafly挑战赛2 B.Travel【思维+SPFA】相关推荐

  1. Wannafly挑战赛26-B 冥土追魂

    地址:https://www.nowcoder.com/acm/contest/212/B 思路:对于行列选取,是选择所有行中的最大值的最小值,当是并不能用贪心来做,例如 2 2 2 7 8 1 9 ...

  2. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  3. [Wannafly挑战赛2D-Delete]最短路

    [Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 ...

  4. Wannafly挑战赛19

    Wannafly挑战赛19 A. 队列Q 需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理. #include <bits/stdc++ ...

  5. Wannafly挑战赛18

    Wannafly挑战赛18 A. 序列 先考虑暴力,相邻两个树之间乘上给定的三种数,递推出下一个位置填什么,然后再check一下,最后一位是否为1即可.这样时间显然不行,但是给我们一种思路,就是中间的 ...

  6. Wannafly 挑战赛27 题解

    Wannafly 挑战赛27 题目连接 https://www.nowcoder.com/acm/contest/215#question A.灰魔法师 题目 题解 考虑到可能的完全平方数只有4004 ...

  7. Wannafly挑战赛24

    Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减 ...

  8. Wannafly挑战赛18B 随机数

    Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...

  9. Wannafly挑战赛14 A-直角三棱锥

    Wannafly挑战赛14 A-直角三棱锥 链接:https://www.nowcoder.com/acm/contest/81/A 来源:牛客网 题目描述 在三维空间中,平面 x = 0, y = ...

最新文章

  1. 路由器互联端口处于不同网段的路由方法和原理
  2. 计算机模拟热处理,计算机模拟在热处理中的应用
  3. Halcon 摄像机标定流程
  4. H5调用APP的方法
  5. 看看这14家科技前沿公司 原来最牛的天使投资是它
  6. python:如何传递一个列表参数
  7. BZOJ 2527 Meteors | 整体二分
  8. ​突破 1nm!台积电祭出“半金属”取代硅材料;搜狗发布手语 AI 合成主播;iOS 微信 8.0.6 版本更新|极客头条...
  9. php中中文字符串的截取和获取长度 mb_substr() mb_strlen()
  10. 你要看看这些有趣的函数方法吗?
  11. 编写if语句时then子句为空语句_Python入门 5——循环语句及条件判断
  12. JAVA实战小项目——图书馆管理系统
  13. ASP.NET程序设计_新闻发布系统
  14. vmware虚拟机复制文件后空间不足删除.cache文件夹
  15. 他25岁进贝尔实验室,32岁提信息论,40岁办达特茅斯会议,晚年患上阿兹海默 | 人物志...
  16. C#中背景图片布局设置
  17. java连连看开题报告_JAVA连连看
  18. Zotero 知网文章不能转成pdf 的解决办法。
  19. IBM副总裁胡世忠:数据是新的自然资源
  20. 1.23 定语从句 感叹句

热门文章

  1. CSDN的博客积分计算规则及博客排名规则
  2. 高度决定视野眼界决定世界
  3. EmuOS :一款超酷的开源复古 Windows 系统模拟器
  4. javascript基础快速入门
  5. 2022年施工升降机司机(建筑特殊工种)考题及模拟考试
  6. python樱花树的设计思路_用python绘制樱花树
  7. pxe+kickstart
  8. wincc按钮控制的vb脚本_关于wincc professinal v15里使用vb脚本操作控件listview的问题-工业支持中心-西门子中国...
  9. (华中师范大学网络教育)2021春季课程作业大学语文
  10. 张晨卸任京东CTO,京东的技术之路怎么走?