Description
女神Megumi将要在scau开签名会。为了拿亲笔签名,众人纷纷前往。但是伦也童鞋决定要自己组装一个漂亮的签名本,
这个签名本需要到很多个地方收集材料。但是他是个路痴,他想知道如何用最快的形式获取这些材料然后去寻找Megumi。

已知scau是一个n个节点m条边的图,伦也需要到k个地方收集材料,a0,a1,…,ak,由于伦也智商有限,这些材料必须按
顺序收集。伦也从点1出发,Megumi在点n。请问他需要至少用多少时间到达?

输入格式
第一行一个整数T,代表有T(T < 10)个test case。

对于每个case,第一行两个数n,m,表示有n个节点,m条边后面是m行,每行两个整数a,b表示点a和点b之间有路,可以
从a走到b,也可以从b走到a。后面一行是一个整数k,表示需要到k个点收集材料。后面一行是k个整数,表示中途需要搜
集材料的位置,保证不会存在起点和终点。(m <= n <= 1000, k < n - 1)

输入保证路径必定存在。

输出格式
对每个test case输出一行,从点1收集完所有材料到达点n所需要的最小时间。

输入样例
1
3 3
1 2
2 3
1 3
1
2

输出样例
2

题意:上面够简洁了

思路:

算法思路(多源最短路):
1.首先理解题目意思,其实还是一个从1->n的问题,只是中间要途径k个点。这些点还得按顺序来,因为每次我贪心的从a[i-1]走到a[i]的最短路是肯定最优的,因为没有后效性。所以这个问题就变成了一个多源最短路的问题,是一个每次起点为a[i-1],到a[i]的多源最短路问题。
2.但是多源最短路的话,最直接的当然是floyd,不过这里1000个数据应该会TL飞,所以考虑堆优化的Dijkstra最短路,每次枚举起点s(s从1->a[1]->a[2]…->a[k]),然后累加跑出来d[t](到终点的最短路)即可。

AC代码:

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const int maxn = 1e6+5;
const ll inf=0x3f3f3f3f3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') ch = getchar();while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0',  ch = getchar();return x; }
int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };
const int V = 3e3, E=3e3;
ll d[V],cost[E];
ll n,m;
ll head[V],pnt[E],nxt[E],e=0;
ll vis[V];
ll a[V];void addedge(ll u,ll v,ll c)
{pnt[e]=v;       //当前以u为顶点,c为边长的,到v的一条边cost[e]=c;      //存入当前边权值nxt[e]=head[u];     //下一个其实是前一个head[u]=e++;        //当前边编号
}inline void Dijkstra(ll s)
{mem(d,inf); mem(vis,0);priority_queue<PII, vector<PII>, greater<PII> > q;d[s] = 0;q.push(mp(0LL,s));while(!q.empty()){ll x = q.top().se; q.pop();if(vis[x]) continue;vis[x] = 1;for(int i=head[x];i!=-1;i = nxt[i]){ll v = pnt[i];if(d[v]>d[x]+cost[i]&&!vis[v]){d[v] = d[x] + cost[i];q.push(mp(d[v], v));}}}//return d[n]==inf?-1:d[n];
}int main()
{int kase;cin>>kase;while(kase--){e = 0; mem(head,-1);mem(d,inf); mem(vis,0);n = read(), m = read();rep(i,1,m){ll x = read(), y = read();addedge(x,y,1);addedge(y,x,1);}ll pos = 0;a[pos++] = 1;   //第一位放1ll k = read();      //读入k个数rep(i,1,k) a[pos++] = read();   a[pos] = n; //最后一位放nll sum = 0;rep(i,1,pos)                //然后枚举起点为a[i-1],终点为a[i],跑最短路取d[t]即可。{ll s = a[i-1], t = a[i];Dijkstra(s);ll ans = d[t];sum += ans;}cout<<sum<<'\n';}return 0;
}

【SCAU18新生赛 论剑】 18362 寻找Megumi 多源最短路相关推荐

  1. 18362 寻找Megumi 迪杰斯特拉+优先队列优化

    传送门: OJ 新生赛 2018华山论剑. 题目大意:从点1出发,按次序经过K个点,再走到点n.求最短路径. 解题思路:弗洛伊德算法可能超时,所以用单源最短路径算法,依次求出从1到a1,a1到a2.. ...

  2. buuctf航海经历([ACTF2020 新生赛])

    前言:今天感觉自己确实有点菜,想提高一下,就斗胆来buuctf论剑,哈哈哈! [HCTF 2018]WarmUp 是关于php代码审计方面的 打开网站额,一个滑稽笑脸,别的啥都没有 看一下源码,  提 ...

  3. QLU ACM 2018新生赛解题报告

    QLU ACM 2018 新生赛解题报告 A [1303]约数个数 题目描述 输入 输出 解析 B [1301]Alice and Bob 题目描述 输入 解析 C [1289] 黑白黑 题目描述 输 ...

  4. HNUCM信息科学与工程学院第二届新生赛——热身赛

    HNUCM信息科学与工程学院第二届新生赛--热身赛 题目比较坑点较多,注意避坑,特别是数据范围和题意,因为是新生赛,所以还是选择使用了c语言书写,基本没有调用内置函数库,排序统一使用了冒泡排序,没有使 ...

  5. [SUCTF2018]babyre [ACTF新生赛2020]fungame

    文章目录 [SUCTF2018]babyre 惯用思维 常人思维 GAMEOVER [ACTF新生赛2020]fungame int __cdecl sub_401340(int a1) int __ ...

  6. BUUCTF Web [ACTF2020 新生赛]Exec

    「作者主页」:士别三日wyx   此文章已录入专栏<网络攻防>,持续更新热门靶场的通关教程 「未知攻,焉知收」,在一个个孤独的夜晚,你完成了几百个攻防实验,回过头来才发现,已经击败了百分之 ...

  7. BUUCTF Web [ACTF2020 新生赛]Include

    「作者主页」:士别三日wyx   此文章已录入专栏<网络攻防>,持续更新热门靶场的通关教程 「未知攻,焉知收」,在一个个孤独的夜晚,你完成了几百个攻防实验,回过头来才发现,已经击败了百分之 ...

  8. 小乐乐与二段数(2019哈理工新生赛第20题)

    链接:2019哈理工新生赛题解 2019哈理工新生赛第20题 T题: 链接:https://ac.nowcoder.com/acm/contest/1877/T 来源:牛客网 题目描述 小乐乐从老师口 ...

  9. 2019年安徽大学ACM/ICPC实验室新生赛题解

    本文仅作个人收藏学习使用 题目及解析来源牛客竞赛网 //作者:王清楚 //链接:https://ac.nowcoder.com/discuss/351408?type=101&order=0& ...

最新文章

  1. 留念,第一次在C中调用lua成功!
  2. Github Pages+Hexo+阿里云域名绑定
  3. HTML form 标签的 accept-charset 属性
  4. php 表单录入,PHP 表单和用户输入
  5. matlab氢原子杂化轨道,网络版原子和分子结构可视化程序的开发
  6. C# FTP 上传、下载、获取文件列表
  7. sql like 多个条件_都9012年啦,不懂得这些SQL语句优化,你是要吃大亏的
  8. 随笔写一个简单的爬虫
  9. 学习Java编程语言难不难
  10. 详解抖音千人千面的智能推荐机制
  11. android 表情包
  12. LabVIEW与Access数据库通信时,如何创建DSN文件
  13. 江西交通职业技术学院计算机网课,第16章-桥墩计算_江西交通职业技术学院:桥涵工程(高职、精品课程)_ppt_大学课件预览_高等教育资讯网...
  14. php 利用gd库及tcpdf 自动多图片生成pdf
  15. R语言需要C语言基础吗,R语言入门(1)-初识R语言
  16. Bella Chat Tech Support
  17. python入门题库 赶紧来试试自己的水平吧
  18. 入门学习-Python-小甲鱼学习资料-Day031-永久存储:腌制一缸美味的泡菜
  19. 进程间通信和线程间通信的几种方式
  20. Java面试-001

热门文章

  1. 最合适的才是最值得珍惜的
  2. java计算机毕业设计货币博物馆展品管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  3. 【敏捷6.2】授权型的高绩效团队
  4. Redis常考点汇总
  5. 00后最喜欢用哪些APP,用这个分析统计一目了然
  6. 这个清明节我要学习微服务架构下分布式事务Seata
  7. 每日新闻简报 365资讯简报12条
  8. poj3122 OpenJudge008 Pie派(二分查找)
  9. Android手机上网、彩信APN设置
  10. 多芯片设计 Designing For Multiple Die