1 条题解

  • 0
    @ 2026-6-11 20:46:22

    不难发现答案只有三种:

    • 不使用代金券,答案为 2↔32 \leftrightarrow 3 的最短路。
    • 使用代金券预约 2→12 \to 1,答案为 1↔31 \leftrightarrow 3 的最短路。
    • 使用代金券预约 1→31 \to 3,答案为 2↔12 \leftrightarrow 1 的最短路。

    输出三个答案的最小值即可。

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 12, M = 4e5 + 12;
    struct F
    {
    	int to[M], ns[M], fs[N], m;
    	void add(int f, int t)
    	{
    		m++;
    		to[m] = t;
    		ns[m] = fs[f];
    		fs[f] = m;
    	}
    };
    F f;
    int sp[N];
    int bfs(int x, int y, int n)
    {
    	for (int i = 1; i <= n; i++)
    		sp[i] = 1e9;
    	queue <int> q;
    	sp[x] = 0;
    	q.push(x);
    	while (!q.empty())
    	{
    		int w = q.front();
    		q.pop();
    		int ii = f.fs[w];
    		while (ii)
    		{
    			if (sp[f.to[ii]] == 1e9)
    			{
    				sp[f.to[ii]] = sp[w] + 1;
    				q.push(f.to[ii]);
    			}
    			ii = f.ns[ii];
    		}
    	}
    	return sp[y];
    }
    int main()
    {
    	freopen("voucher.in", "r", stdin);
    	freopen("voucher.out", "w", stdout);
    	ios::sync_with_stdio(0);
    	int n, m;
    	cin >> n >> m;
    	while (m--)
    	{
    		int u, v;
    		cin >> u >> v;
    		f.add(u, v);
    		f.add(v, u);
    	}
    	int a = 1e9;
    	a = min(a, bfs(1, 2, n));
    	a = min(a, bfs(1, 3, n));
    	a = min(a, bfs(2, 3, n));
    	if (a == 1e9) a = -1;
    	cout << a << endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    270
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    28
    已通过
    12
    上传者