首页 > 其他分享 >luogu P5037 抓捕

luogu P5037 抓捕

时间:2023-01-09 10:12:25浏览次数:53  
标签:return vis int luogu 抓捕 read pair P5037 dis

## 题意

有 $n$ 个点的图,任意一点 $x$ 到可去另外一点 $y$ 必须互质,即 $\gcd(x,y)=1$。

图无边权,但是拥有点权。求到终点 $en$ 的最短距离。

---

## 思路

此题需使用 Dijkstra 算法求最短路。最后要求 $x$ 到 $y$ 的最短路径,如果直接暴力算最短路,肯定 TLE,怎么办呢?

考虑每次压入优先队列时,带上当前体力值,这样,就可以记录上次的最短距离。

---

**性质**

- Dijkstra 算法的运算特征:由当前最小值向连着的点拓展。
- 此图的特性:没有边权,只有从一点到走廊(边)上才会耗费体力值。

由此即可得:**当第一次对终点 $y$ 进行松弛操作时的值就是答案**。

---

## code

```cpp
#include<bits/stdc++.h>
#define k pair <int, int>//宏定义
using namespace std;
const int N = 4.5e3+10;
static inline int read () {//快读
int x = 0;bool f = 1; char s = getchar();
while(s<'0'||s>'9'){if(s=='-')f=0;s=getchar();}
while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+(s^48);s=getchar();}
return f?x:-x;
}
//inline:内联函数

int T, n, a[N], h[N*N], cnt;//注意:一定是N*N!!!
struct edge {int to, next;} e[N*N];

static inline void add(int x,int y){//链式前向星存图
e[++cnt].to = y;
e[cnt].next = h[x];
h[x] = cnt;
}

bool vis[N];int dis[N];
priority_queue<k,vector<k>,greater<k> >q;//优先队列 pair型

static inline void dijkstra(int s, int en){//求最短路
memset(dis, 0x3f, sizeof dis);
memset(vis, 0, sizeof vis);
priority_queue<k,vector<k>,greater<k> >().swap(q);//清零 且清空内存
dis[s] = 0;
q.push(make_pair(dis[s]+a[s], s));//first:最小值 second:编号
while(q.size()){
pair<int,int> u = q.top(); q.pop();
int x = u.first, y = u.second;
vis[y] = 1;
for(int i = h[y]; i; i = e[i].next) {
int v = e[i].to;
if (vis[v]) continue;//松弛处理
if (dis[v] > dis[y]+a[y]){//从点到边耗费体力
dis[v] = x;//上次的值
if (v == en){
printf("%d\n",dis[v]);
return ;
} q.push(make_pair(dis[v]+a[v], v));
}
}
} puts("-1\n");//到不了 输出 -1
return ;
}

signed main(void){
T=read();n=read();
for(int i = 2; i < n; ++ i)
for(int j = i+1; j <= n; ++ j)
if(__gcd(i, j) == 1){//判断互质 ,最大公因数为 1
add(i, j);
add(j, i);//无向图
}
while (T --) {
int x = read(), y = read();
for(int i = 1; i <= n; ++ i) a[i] = read();
dijkstra(x, y);//记得用快读,开 O2
}
return 0;
}
```

标签:return,vis,int,luogu,抓捕,read,pair,P5037,dis
From: https://www.cnblogs.com/GOD-HJ/p/17036138.html

相关文章

  • Luogu P4591 [TJOI2018] 碱基序列
    链接难度:\(\texttt{省选/NOI-}\)有\(k\)组,每一组有\(a_i\)个字符串\(t_{k,a_i}\),询问分别在每一组选一个字符串拼成的字符串在文本串\(s\)出现的个数的所有情况......
  • 题解: Luogu P8894 「UOI-R1」求和
    题目链接:link前言我的一个学长在一次比赛中出了这道题,然后,我就把这道题切了其实这道题还是比较简单的,然后我就介绍一下我的比赛时的思路和做法30分做法根据标签我......
  • Luogu P2082 区间覆盖(加强版)
    链接难度:普及/提高-有\(n\)个区间\([s_i,t_i]\),求被这\(n\)个区间覆盖的长度。数据范围:\(n\le10^5,1\les_i<t_i\le10^17\)。把每个区间都换成一组匹配的括......
  • luogu P2757 [国家集训队]等差子序列
    Link题解降智了。。。首先我们不需要关心\(Len\)是多少,只需要找到长度为\(3\)的等差子序列就行了。然后就枚举中点\(mid\),看看存不存在\(l<mid<r\)使得\(a_{mi......
  • 题解 : Luogu P2197 【模板】nim 游戏
    题目链接:link结论如果$a_1\oplusa_2\oplus...\oplusa_n\not=0$,则先手必胜证明操作到最后时,每堆石子数都是\(0\),\(0\oplus0\oplus...\oplus0=0......
  • Luogu P4178 Tree
    LuoguP4178Tree难度:省选/NOI-标签:点分治\(\mathtt{blog}\)\(n\)个点的树,边\((u_i,v_i)\)有边权\(w_i\),询问距离\(\lek\)的点对数量。数据范围:\(n\le4\times......
  • POJ 2114 Boatherds / Luogu P3806 【模板】点分治1
    POJ2114Boatherds/LuoguP3806【模板】点分治1难度:\(\mathtt{?}\)/省选/NOI-标签:点分治\(\mathtt{blog}\)\(n\)个点的树,边\((u_i,v_i)\)有边权\(w_i\),\(m\)......
  • Luogu P5676 [GZOI2017] 小z玩游戏
    P5676[GZOI2017]小z玩游戏难度:提高+/省选-标签:Tarjan建图\(\mathtt{blog}\)有\(n\)组数\((w_i,e_i)\),如果当前数值为\(w_i\)即可改变为\(e_i\),如果当前数值......
  • Luogu6620 组合数问题 - 第二类斯特林数 -
    题目链接:https://www.luogu.com.cn/problem/P6620题解:其实就一个式子证明可以利用这个式子找一下规律$$k\binom{n}{k}=n\binom{n-1}{k-1}$$回到原题,把多项式拆开之......
  • Luogu4043 支线剧情 - 费用流 -
    题目链接:https://www.luogu.com.cn/problem/P4043题意:求图一个的路径并,使得所有边都包含且所有路径的权值之和最小,而且路径都是从1开始的题解:每条边都必须经过,容量设一......