CCF 201512-4 送货

CCF 201512-4 送货 传送门

此题只得了80分, 说是运行错误, 找了好久的bug, 都找不出哪里出错. 然后找了其他博客代码, 提交了三四个, 都是80分(他们博客上说是100分代码).

然后我想, 这应该是CCF的问题吧.

这道题就是求欧拉路径.

注意几点:
1.一定要判断是否是连通图, 不然是错的.(判断输出点数是否为m + 1即可)
2.bool类型可以开boo[10000][10000]的, 大约100M的内存, 但是int不可以(256M限制)
3. 欧拉路径倒着存, 倒着输出. 如果遇到了就push的话, 孤立点会出错

80分代码在我心中它是100分. 哦耶

#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
using namespace std;

const int maxn = 10010;
int n, m, degree[maxn] = {}, odd = 0;
vector<int> G[maxn], ans;
bool Gra[maxn][maxn] = {};

void Euler(int u)
{
    for (int i = 0; i < G[u].size(); ++i) {
        int v = G[u][i];
        if (Gra[u][v]) {
            Gra[u][v] = Gra[v][u] = false;
            Euler(v);
        }
    }
    ans.push_back(u);
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        degree[u]++, degree[v]++;
        G[u].push_back(v), G[v].push_back(u);
        Gra[u][v] = Gra[v][u] = true;
    }
    for (int i = 1; i <= n; ++i) {
        if (degree[i] % 2 == 1) odd++;
    }
    if (!(odd == 0 || (odd == 2 && degree[1] % 2))) {
        cout << -1;
        return 0;
    }
    for (int i = 1; i <= n; ++i) {
        sort(G[i].begin(), G[i].end());
    }
    Euler(1);
    if (ans.size() != m + 1) {
        cout << -1;
        return 0;
    }
    for (int i = ans.size() - 1; i >= 0; --i) {
        cout << ans[i] << ' ';
    }
}

猜你喜欢

转载自blog.csdn.net/wjh2622075127/article/details/81543507