首页 > 其他分享 >[ABC257F] Teleporter Setting 题解

[ABC257F] Teleporter Setting 题解

时间:2023-10-05 22:45:48浏览次数:43  
标签:dis1 Teleporter ver int 题解 dis2 st ABC257F 号点

1.题目

洛谷传送门

2.思路

我们可以把不确定的点当成真实存在的 \(0\) 号点,建边的时候就正常连即可。

然后我们来看一个样例:

1 - 2 - 0
3 - 4 - 5

当我们把 \(0\) 号点看成 \(3\) 号点时,答案就是 \(1\) 号点到 \(0\) 号点的距离加上 \(3\) 号点到 \(5\) 号点的距离。

然后我们再看:

1 - 2
0 - 3 - 4 - 5

当我们把 \(0\) 号点看成 \(2\) 号点时,答案就是 \(1\) 号点到 \(2\) 号点的距离加上 \(0\) 号点到 \(5\) 号点的距离。

注意还有一种用不到 \(0\) 号点的情况:

1 - 2 - 5
0 - 3 - 4

那么答案就是 \(1\) 号点到 \(5\) 号点的距离。

综上所述,对于每个将 \(0\) 号点当成 \(i\) 号点的方案,其答案为以上三种情况结果的最小值。

3.代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;

const int N = 1000010;
typedef pair <int, int> PII;

int n, m;
int h[N], e[N], ne[N]; 
int dis1[N], dis2[N], st[N];
int idx;

void add (int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

void dijkstra1 () { //最短路,求出 1 号点到每个点的距离
	memset (dis1, 0x3f, sizeof dis1);
	dis1[1] = 0;
	
	priority_queue <PII, vector <PII>, greater <PII> > p;
	p.push ({0, 1});
	
	while (!p.empty ()) {
		auto t = p.top ();
		p.pop ();
		
		int ver = t.second, dit = t.first;
		
		if (st[ver]) {
			continue;
		}
		
		st[ver] = true;
		for (int i = h[ver]; i != -1; i = ne[i]) {
			int j = e[i];
			if (dis1[j] > dit + 1) {
				dis1[j] = dit + 1;
				p.push ({dis1[j], j});
			}
		}
	}
}

void dijkstra2 () { //最短路,求出 N 号点到每个点的距离
	memset (dis2, 0x3f, sizeof dis2);
	memset (st, 0, sizeof st); //注意要把判断数组清空
	dis2[n] = 0;
	
	priority_queue <PII, vector <PII>, greater <PII> > p;
	p.push ({0, n});
	
	while (!p.empty ()) {
		auto t = p.top ();
		p.pop ();
		
		int ver = t.second, dit = t.first;
		
		if (st[ver]) {
			continue;
		}
		
		st[ver] = true;
		for (int i = h[ver]; i != -1; i = ne[i]) {
			int j = e[i];
			if (dis2[j] > dit + 1) {
				dis2[j] = dit + 1;
				p.push ({dis2[j], j});
			}
		}
	}
}

int main () {
	cin >> n >> m;
	memset (h, -1, sizeof h);
	
	while (m --) {
		int a, b;
		cin >> a >> b;
		add (a, b); //建边,而且是双向边
		add (b, a);
	}
	
	dijkstra1 ();
	dijkstra2 ();

	int ans = 0;
	for (int i = 1; i <= n; i ++) {
		ans = min ({dis1[n], dis1[0] + dis2[i], dis1[i] + dis2[0]});
      //dis1[i] 存 i 号点到 1 号点的距离
      //dis2[i] 存 i 号点到 N 号点的距离
		if (ans == 0x3f3f3f3f) cout << -1 << ' ';//如果没有答案
		else cout << ans << ' ';
	}
	return 0;
}

标签:dis1,Teleporter,ver,int,题解,dis2,st,ABC257F,号点
From: https://www.cnblogs.com/linbaicheng/p/17744062.html

相关文章

  • 【思维】【DP】ABC298Ex Sum of Min of Length 题解
    ABC298Ex简单题。因为有\(\min\)不好做,容易想到讨论\(d(i,L)\)和\(d(i,R)\)的大小。令\(p=\text{LCA}(L,R)\),\(dep_L>dep_R,dist=dep_L+dep_R-2\timesdep_p\),\(now\)满足\(dep_L-dep_{now}=\lfloor\dfrac{dist}{2}\rfloor\)则\(L\)一定在......
  • 【图论】【寻找性质】CF1151E Number of Components 题解
    CF1151E发现每一个\(f(l,r)\)中的连通块总是一条链(一棵树)。那么此时连通块的数量就等于点的数量减去边的数量。先考虑点的总数,一个价值为\(a_i\)的点一定是在\(l\leqslanta_i\)且\(r\geqslanta_i\)的\(f(l,r)\)中才会有一个贡献,根据乘法原理,它会产生\(a_i\time......
  • 【二分】P7795 [COCI2014-2015#7] PROSJEK 题解
    P7795典。显然\(\mathcal{O}(n^2)\)的时间复杂度无法通过。使子段平均值最大,考虑二分。可以二分平均值\(mid\),然后判断是否有满足条件的子段.时间复杂度:\(\mathcal{O}(\dfrac{n\log\max\{a_i\}}{\text{eps}})\),其中\(\text{eps}\)为设置的精度,\(\max\{a_i\}\leq10......
  • P8565 Sultan Rage 题解
    P8565发现数列\(a\)增长的特别快,项数最多时是\(a_1=a_2=\cdots=a_{100}\),但这样也只会有一百多项就可以超过\(10^{18}\)。可以考虑搜索,因为搜索树会比较稀疏,函数dfs(val,cur)表示凑出\(x\)还需要\(val\),现在在考虑\(cur\)。但光是搜索肯定不能过这道题,考虑优......
  • P4133 [BJOI2012]最多的方案 题解
    P4133双倍经验发现斐波那契数列增长极快,不到\(100\)项就超过了\(10^{18}\),搜索树也极为稀疏,可以考虑搜索。爆搜肯定会超时,考虑优化:可行性剪枝。记忆化,去除重复的计算。改变搜索的顺序,因为先考虑小元素的话,会有较多的无用的搜索,且小元素较灵活,更容易凑到\(x\),故可......
  • 【竞赛图】【DP】ARC163D Sum of SCC 题解
    ARC163D发现这个竞赛图一定能被分为两个集合\(A\),\(B\)。满足\(\forallu\inA,v\inB\),均有\(u\tov\inE\)。答案就是划分这两个集合的方案数。证明:首先,竞赛图缩完点后一定是一条链,对强连通分量进行标号,满足编号小的强连通分量指向编号大的强连通分量。不妨令竞赛图\(G\)......
  • 【整除分块】【DP】ABC239Ex Dice Product 2 题解
    ABC239H简单题。令\(f_i\)表示乘到\(\gei\)的期望。容易得到\(f_i=\dfrac{\sum\limits_{j=1}^{n}f_{\lceil\frac{i}{j}\rceil}}{n}\)。将\(f_i\)移到同一边,去掉系数,有\(f_i=\dfrac{n\sum\limits_{j=2}^{n}f_{\lceil\frac{i}{j}\rceil}}{n-1}\)。提出\(\frac{n-1}{n......
  • 【字符串】【哈希】ABC284F ABCBAC 题解
    ABC284F这题的正解是\(Z\)函数。如果\(str=T+T\)的话,若可以找到连续的分别长为\(n\)的两段,且这两段可通过\(1\)次翻转变为相同的字符串,那么便一定有解,否则无解。暴力判断是\(\mathcal{O}(n)\)的,时间复杂度直接上天。可以用哈希\(\mathcal{O}(1)\)地判断出两个......
  • 【组合计数】ARC058D Iroha and a Grid 题解
    ARC058D简单组合计数。可以先把矩形旋转一下,变为求从\((1,1)\)走到\((n,m)\),只能向上或向右移动。且不经过左上角的\(A\timesB\)的禁区的方案数,对\(10^9+7\)取模。假如没有\(A\timesB\)的禁区的话,那么方案数为\(C_{n+m-2}^{n-1}\)。就是一共要走\(n+m-2\)......
  • 「题解」Codeforces Round 883 (Div. 3)
    A.EscalatorConversationsProblem[题目](RudolphandCuttheRope)Sol&Code绳子长度大于钉子高度的要剪#include<bits/stdc++.h>typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}in......