提出 #62138147


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
int n, m, s, t;
vector<vector<int>> to;
bool check()
{
    if (m != n - 1)
        return true;
    int mx = 0;
    for (int i = 1; i <= n; ++i)
        mx = max(mx, (int)to[i].size());
    return mx > 2;
}
void bfs(int s, vector<bool> &ban, vector<int> &dis, vector<int> &pre)
{
    for (int i = 1; i <= n; ++i)
    {
        dis[i] = inf;
    }
    queue<int> q;
    q.push(s);
    dis[s] = 0;
    while (!q.empty())
    {
        int u = q.front();
        q.pop();
        for (int v : to[u])
        {
            if (ban[v])
                continue;
            if (dis[v] > dis[u] + 1)
            {
                dis[v] = dis[u] + 1;
                q.push(v);
                pre[v] = u;
            }
        }
    }
}
int main()
{
    cin >> n >> m >> s >> t;
    to.resize(n + 1);
    for (int i = 1; i <= m; ++i)
    {
        int u, v;
        cin >> u >> v;
        to[u].push_back(v);
        to[v].push_back(u);
    }

    vector<int> dis(n + 1), dis2(n + 1), dis3(n + 1);
    vector<int> pre(n + 1);
    vector<bool> ban(n + 1);
    bfs(s, ban, dis, pre);

    vector<bool> in_road(n + 1);
    vector<int> road;
    for (int i = t; i != s; i = pre[i])
    {
        road.push_back(i);
        in_road[i] = true;
    }
    in_road[s] = true;
    road.push_back(s);

    ban[t] = true;
    bfs(s, ban, dis2, pre);
    ban[t] = false;
    ban[s] = true;
    bfs(t, ban, dis3, pre);
    ban[s] = false;
    int ans = inf;
    for (int v = 1; v <= n; ++v)
        if (!in_road[v] && dis2[v] != inf && dis3[v] != inf)
        {
            ans = min(ans, dis[t] + dis2[v] + dis3[v]);
        }

    for (int v = 1; v <= n; ++v)
        if (!in_road[v])
        {
            for (int vv : to[v])
                if (vv != s && vv != t && in_road[vv])
                    ans = min(ans, dis[t] * 2 + 2);
        }

    for (int u = 1; u <= n; ++u)
        if (u != s && u != t && in_road[u])
            ban[u] = true;

    vector<int> deg(n + 1);
    for (int u = 1; u <= n; ++u)
        for (int v : to[u])
            if (!(in_road[u] && in_road[v]))
            {
                ++deg[u];
            }

    {
        ban[t] = true;
        bfs(s, ban, dis2, pre);
        ban[t] = false;
        ban[s] = true;
        bfs(t, ban, dis3, pre);
        ban[s] = false;
        int x = inf, y = inf;
        for (int u = 1; u <= n; ++u)
            if (dis2[u] != inf && deg[u] >= 3)
            {
                x = min(x, dis2[u]);
            }
        if (deg[s] >= 2)
            x = 0;
        for (int u = 1; u <= n; ++u)
            if (dis3[u] != inf && deg[u] >= 3)
            {
                y = min(x, dis3[u]);
            }
        if (deg[t] >= 2)
            y = 0;
        int z = min(x, y);
        if (z != inf)
        {
            ans = min(ans, 2 * dis[t] + (z + 1) * 4);
        }
    }
    if (ans == inf)
        ans = -1;
    cout << ans << '\n';
}

/*
1. 检查图是否是一条链,如果是,输出-1
2.
先取一条s到t的最短路径,设路径为
s,u1,u2,...,uk,t

3. 先考虑走两条不同路径的情况:
对于一个点v,v不属于这条路径上的点
那么经过点v需要的步数是 dis(s,t)+dis2(s,v)+dis3(v,t)
注意:dis2(s,v)不能经过点t,即删掉点t再做最短路计算
注意:dis3(v,t)不能经过点s,即删掉点s再做最短路计算
在所有点v中去取这个距离最小的即可

4. 如果存在一个点v,v不属于这条路径上的点,且v与u1,u2,...,uk中任意一个点相邻
则答案和2+2dis(s,t)取min

5.
删除点u1,u2,...,uk后
如果点s和点t不在一个连通块:
设x为点s走到的第一个度数>=3的点的距离(没有就是inf)
设y为点t走到的第一个度数>=3的店的距离(没有就是inf)
设 z=min(x,y)
答案和2dis(s,t)+4(z+1)取min


4 3 2 3
1 2
2 3
2 4
*/

提出情報

提出日時
問題 D - Moving Pieces on Graph
ユーザ JingTang
言語 C++ 20 (gcc 12.2)
得点 0
コード長 4035 Byte
結果 WA
実行時間 262 ms
メモリ 19676 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 0 / 700
結果
AC × 3
AC × 63
WA × 1
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_handmade_00.txt, 01_handmade_01.txt, 01_handmade_02.txt, 01_handmade_03.txt, 01_handmade_04.txt, 01_handmade_05.txt, 01_handmade_06.txt, 02_line_00.txt, 02_line_01.txt, 02_line_02.txt, 03_line_like_00.txt, 03_line_like_01.txt, 03_line_like_02.txt, 03_line_like_03.txt, 03_line_like_04.txt, 03_line_like_05.txt, 03_line_like_06.txt, 03_line_like_07.txt, 03_line_like_08.txt, 03_line_like_09.txt, 03_line_like_10.txt, 03_line_like_11.txt, 03_line_like_12.txt, 03_line_like_13.txt, 03_line_like_14.txt, 03_line_like_15.txt, 03_line_like_16.txt, 03_line_like_17.txt, 03_line_like_18.txt, 03_line_like_19.txt, 03_line_like_20.txt, 03_line_like_21.txt, 03_line_like_22.txt, 03_line_like_23.txt, 04_circle_like_00.txt, 04_circle_like_01.txt, 04_circle_like_02.txt, 04_circle_like_03.txt, 04_circle_like_04.txt, 04_circle_like_05.txt, 04_circle_like_06.txt, 04_circle_like_07.txt, 04_circle_like_08.txt, 04_circle_like_09.txt, 05_dense_00.txt, 05_dense_01.txt, 05_dense_02.txt, 06_random_00.txt, 06_random_01.txt, 06_random_02.txt, 06_random_03.txt, 06_random_04.txt, 06_random_05.txt, 06_random_06.txt, 06_random_07.txt, 06_random_08.txt, 06_random_09.txt, 07_uni_00.txt, 07_uni_01.txt, 07_uni_02.txt, 07_uni_03.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 3484 KiB
00_sample_01.txt AC 1 ms 3404 KiB
00_sample_02.txt AC 1 ms 3452 KiB
01_handmade_00.txt AC 1 ms 3408 KiB
01_handmade_01.txt AC 1 ms 3420 KiB
01_handmade_02.txt AC 1 ms 3476 KiB
01_handmade_03.txt AC 1 ms 3460 KiB
01_handmade_04.txt AC 1 ms 3416 KiB
01_handmade_05.txt AC 167 ms 15464 KiB
01_handmade_06.txt AC 195 ms 18684 KiB
02_line_00.txt AC 5 ms 3832 KiB
02_line_01.txt AC 214 ms 18464 KiB
02_line_02.txt AC 261 ms 18816 KiB
03_line_like_00.txt AC 252 ms 17844 KiB
03_line_like_01.txt AC 254 ms 17856 KiB
03_line_like_02.txt AC 166 ms 12788 KiB
03_line_like_03.txt AC 198 ms 17832 KiB
03_line_like_04.txt AC 81 ms 11304 KiB
03_line_like_05.txt AC 148 ms 17648 KiB
03_line_like_06.txt AC 68 ms 10700 KiB
03_line_like_07.txt AC 191 ms 18572 KiB
03_line_like_08.txt AC 220 ms 18240 KiB
03_line_like_09.txt AC 137 ms 13168 KiB
03_line_like_10.txt AC 84 ms 11904 KiB
03_line_like_11.txt AC 208 ms 18660 KiB
03_line_like_12.txt AC 178 ms 18604 KiB
03_line_like_13.txt AC 174 ms 18272 KiB
03_line_like_14.txt AC 183 ms 16008 KiB
03_line_like_15.txt AC 70 ms 11168 KiB
03_line_like_16.txt AC 165 ms 19124 KiB
03_line_like_17.txt AC 262 ms 18740 KiB
03_line_like_18.txt AC 3 ms 3584 KiB
03_line_like_19.txt AC 3 ms 3568 KiB
03_line_like_20.txt AC 1 ms 3572 KiB
03_line_like_21.txt AC 1 ms 3536 KiB
03_line_like_22.txt AC 2 ms 3476 KiB
03_line_like_23.txt WA 2 ms 3476 KiB
04_circle_like_00.txt AC 246 ms 18848 KiB
04_circle_like_01.txt AC 198 ms 18480 KiB
04_circle_like_02.txt AC 222 ms 18732 KiB
04_circle_like_03.txt AC 219 ms 18788 KiB
04_circle_like_04.txt AC 194 ms 18588 KiB
04_circle_like_05.txt AC 22 ms 5756 KiB
04_circle_like_06.txt AC 22 ms 5732 KiB
04_circle_like_07.txt AC 23 ms 5836 KiB
04_circle_like_08.txt AC 22 ms 5700 KiB
04_circle_like_09.txt AC 23 ms 5820 KiB
05_dense_00.txt AC 56 ms 6344 KiB
05_dense_01.txt AC 10 ms 3904 KiB
05_dense_02.txt AC 28 ms 4928 KiB
06_random_00.txt AC 112 ms 10396 KiB
06_random_01.txt AC 118 ms 10432 KiB
06_random_02.txt AC 174 ms 16548 KiB
06_random_03.txt AC 162 ms 12884 KiB
06_random_04.txt AC 130 ms 10096 KiB
06_random_05.txt AC 163 ms 16920 KiB
06_random_06.txt AC 130 ms 9904 KiB
06_random_07.txt AC 179 ms 16088 KiB
06_random_08.txt AC 164 ms 16292 KiB
06_random_09.txt AC 168 ms 18068 KiB
07_uni_00.txt AC 68 ms 12676 KiB
07_uni_01.txt AC 22 ms 6884 KiB
07_uni_02.txt AC 124 ms 18820 KiB
07_uni_03.txt AC 124 ms 19676 KiB