20 分求调
查看原帖
20 分求调
773235
dctc1494楼主2024/8/21 12:44

下面代码样例能过,第一个测试点能过,剩下的 WA\color{red}{\text{WA}} 了。

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;

struct Edge {
    int to, w, next;
} E[N];

struct edge {
    int s, e, w;
    bool operator < (edge other) const {
        return e < other.e;
    }
};

int n, m, u, v, w, cnt, head[N];
bool vis[N];

void init() {
    cnt = 0;
    for (int i = 0; i <= n; ++i) {
        head[i] = -1;
    }
}

void add(int u, int v, int w) {
    E[cnt] = {v, w, head[u]};
    head[u] = cnt++;
}

void print_edge() {
    for (int i = 1; i <= n; ++i) {
        vector<edge> e;
        for (int j = head[i]; j != -1; j = E[j].next) {
            e.push_back({i, E[j].to, E[j].w});
        }
        sort(e.begin(), e.end());
        for (edge j : e) {
            cout << j.s << " -> " << j.e << "  cost: " << j.w << endl;
        }
    }
}

void dfs(int x) {
    cout << x << " ";
    vis[x] = false;
    vector<edge> e;
    for (int j = head[x]; j != -1; j = E[j].next) {
        e.push_back({x, E[j].to, E[j].w});
    }
    sort(e.begin(), e.end());
    for (edge j : e) {
        if (vis[j.e]) {
            dfs(j.e);
        }
    }
}

void bfs(int s) {
    memset(vis, true, sizeof(vis));
    queue<int> q;
    q.push(s);
    cout << s << " ";
    while (!q.empty()) {
        int qf = q.front();
        q.pop();
        vector<edge> e;
        for (int j = head[qf]; j != -1; j = E[j].next) {
            e.push_back({qf, E[j].to, E[j].w});
        }
        sort(e.begin(), e.end());
        for (edge j : e) {
            if (vis[j.e]) {
                vis[j.e] = false;
                cout << j.e << " ";
                q.push(j.e);
            }
        }
    }
}

int main() {
    memset(vis, true, sizeof(vis));
    cin >> n >> m;
    init();
    for (int i = 1; i <= m; ++i) {
        // cin >> u >> v >> w;
        cin >> u >> v;
        add(u, v, 1);
    }
    dfs(1);
    cout << endl;
    bfs(1);
    cout << endl;

    return 0;
}
2024/8/21 12:44
加载中...