求助模拟赛题
  • 板块题目总版
  • 楼主Windy_YY
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/8/15 16:34
  • 上次更新2023/10/27 15:17:54
查看原帖
求助模拟赛题
378467
Windy_YY楼主2022/8/15 16:34

rt 原题 SCU4444 神奇

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2e5 + 233;
vector <int> z[N];
int dis[N];
bool inque[N];
const int INF = 1e9;

signed main() {
    int n, m, a, b;
    while (scanf ("%lld%lld%lld%lld", &n, &m, &a, &b) == 4) {
        for (int i = 1; i <= n; i ++)
            z[i].clear();
        bool flag = false;
        while (m --) {
            int a, b;
            scanf ("%lld%lld", &a, &b);
            z[a].push_back(b);
            z[b].push_back(a);
            if (a == 1 && b == n || a == n && b == 1)
                flag = true;
        }
        if (flag) {
            memset (dis, 0, sizeof dis);
            dis[n] = INF;
            set <int> se1, se2;
            for (int i = 2; i <= n; i ++)
                se1.insert(i);
            queue <int> que;
            que.push(1);
            dis[1] = 0;
            while (que.size()) {
                int u = que.front();
                que.pop();
                for (auto &v : z[u])
                    if (se1.count(v)) {
                        se1.erase(v);
                        se2.insert(v);
                    }
                for (auto &v : se1) {
                    que.push(v);
                    dis[v] = dis[u] + b;
                }
                se1.swap(se2);
                se2.clear();
            }
            // for (int i = 1; i <= n; i ++)
            //     cout << dis[i] << ' ';
            // cout << '\n';
            printf ("%lld\n", min(a, dis[n]));
        } else {
            queue <int> que;
            for (int i = 0; i <= n; i ++)
                dis[i] = INF;
            // memset (inque, false, sizeof inque);
            que.push(1);
            dis[1] = 0;
            inque[1] = true;
            while (que.size()) {
                int u = que.front();
                que.pop();
                inque[1] = false;
                for (auto &v : z[u])
                    if (dis[v] > dis[u] + a) {
                        dis[v] = dis[u] + a;
                        if (!inque[v]) {
                            inque[v] = true;
                            que.push(v);
                        }
                    }
            }
            printf ("%lld\n", min(dis[n], b));
        }
    }
    return 0;
}


按说 inque 不用清空,可是 WA 了

然后清空了 inque

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2e5 + 233;
vector <int> z[N];
int dis[N];
bool inque[N];
const int INF = 1e9;

signed main() {
    int n, m, a, b;
    while (scanf ("%lld%lld%lld%lld", &n, &m, &a, &b) == 4) {
        for (int i = 1; i <= n; i ++)
            z[i].clear();
        bool flag = false;
        while (m --) {
            int a, b;
            scanf ("%lld%lld", &a, &b);
            z[a].push_back(b);
            z[b].push_back(a);
            if (a == 1 && b == n || a == n && b == 1)
                flag = true;
        }
        if (flag) {
            memset (dis, 0, sizeof dis);
            dis[n] = INF;
            set <int> se1, se2;
            for (int i = 2; i <= n; i ++)
                se1.insert(i);
            queue <int> que;
            que.push(1);
            dis[1] = 0;
            while (que.size()) {
                int u = que.front();
                que.pop();
                for (auto &v : z[u])
                    if (se1.count(v)) {
                        se1.erase(v);
                        se2.insert(v);
                    }
                for (auto &v : se1) {
                    que.push(v);
                    dis[v] = dis[u] + b;
                }
                se1.swap(se2);
                se2.clear();
            }
            // for (int i = 1; i <= n; i ++)
            //     cout << dis[i] << ' ';
            // cout << '\n';
            printf ("%lld\n", min(a, dis[n]));
        } else {
            queue <int> que;
            for (int i = 0; i <= n; i ++)
                dis[i] = INF;
            memset (inque, false, sizeof inque);
            que.push(1);
            dis[1] = 0;
            inque[1] = true;
            while (que.size()) {
                int u = que.front();
                que.pop();
                inque[1] = false;
                for (auto &v : z[u])
                    if (dis[v] > dis[u] + a) {
                        dis[v] = dis[u] + a;
                        if (!inque[v]) {
                            inque[v] = true;
                            que.push(v);
                        }
                    }
            }
            printf ("%lld\n", min(dis[n], b));
        }
    }
    return 0;
}

就过了

但是

我spfa61行把inque[u]=false写成了inque[1]=false

为什么第二种能过 第一种WA了

2022/8/15 16:34
加载中...