QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#621763#6421. Degree of Spanning Treegates_orzTL 3ms3956kbC++202.8kb2024-10-08 16:45:242024-10-08 16:45:24

Judging History

你现在查看的是最新测评结果

  • [2024-10-08 16:45:24]
  • 评测
  • 测评结果:TL
  • 用时:3ms
  • 内存:3956kb
  • [2024-10-08 16:45:24]
  • 提交

answer

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;

typedef long long LL;
//#define int LL
#define inl inline
const int N = 3e5 + 10;
const int M = N * 2;
//const int mod=998244353;
const int mod = 1000000007;
const double eps = 1e-8;
//const int mod=1e9+7;
typedef pair<int, int> PII;
//const int INF=0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
int n, m;

void become_faster() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

struct Node {
    int u, v;
};

Node edge[N];

struct DSU {
    vector<int> fa, siz;

    DSU() {
    }

    DSU(int n) {
        init(n);
    }

    void init(int n) {
        fa.resize(n);
        iota(fa.begin(), fa.end(), 0);
        siz.assign(n, 1);
    }

    int find(int x) {
        while (x != fa[x]) {
            x = fa[x] = fa[fa[x]];
        }
        return x;
    }

    bool same(int x, int y) {
        return find(x) == find(y);
    }

    bool merge(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) {
            return false;
        }
        siz[x] += siz[y];
        fa[y] = x;
        return true;
    }

    int size(int x) {
        return siz[find(x)];
    }
};

int getRand(int min, int max) {
    return (rand() % (max - min + 1)) + min;
}

void solve() {
    cin >> n >> m;
    vector<vector<int> > g(n + 1);
    for (int i = 1; i <= m; i++) {
        auto &[u,v] = edge[i];
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    vector<int> d(n + 1, 0);
    DSU dsu(n+1);
    vector<PII>res;
    int sign=1;
    auto dfs = [&](auto &self, int u, int fa)-> void {
        if(!sign)return;
        if (fa) {
            res.push_back({u,fa});
            d[u]++;
            d[fa]++;
            if(d[u]>n/2||d[fa]>n/2)sign=0;
        }
        for(auto v:g[u]) {
            if(v==fa)continue;
            if(dsu.same(u,v))continue;
            dsu.merge(u,v);
            self(self,v,u);
        }
    };

    auto work = [&]() {
        for (int i = 1; i <= n; i++)shuffle(g[i].begin(), g[i].end(), std::mt19937{std::random_device{}()});
        srand(time(0));
        int root = getRand(1, n);
        d.assign(n+1,0);
        dsu.init(n+1);
        res.clear();
        sign=1;
        dfs(dfs,root,0);
        return sign==1;
    };
    for (int i = 1; i <= 200; i++) {
        if (work()) {
            cout<<"Yes"<<"\n";
            for(auto [t1,t2]:res) {
                cout<<t1<<" "<<t2<<"\n";
            }
            return;
        }
    }
    cout << "No" << endl;
}

signed main() {
    become_faster();
    int T = 1;
    //T=read();
    cin >> T;
    //for(int i=1;i<=100;i++)solve(i);
    while (T--) solve();
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 3ms
memory: 3956kb

input:

2
6 9
1 2
1 3
1 4
2 3
2 4
3 4
4 5
4 6
4 6
3 4
1 3
2 3
3 3
1 2

output:

Yes
3 2
1 3
4 1
6 4
5 4
No

result:

ok 2 cases

Test #2:

score: -100
Time Limit Exceeded

input:

11140
10 15
9 6
5 7
6 5
2 3
7 5
7 5
3 10
9 7
5 5
9 1
7 5
2 8
7 5
4 3
6 2
9 19
3 7
3 9
2 8
2 8
3 6
5 1
1 8
8 9
8 3
4 8
5 5
3 1
4 3
1 3
8 6
1 3
7 4
4 3
8 8
12 20
10 2
5 5
2 4
3 3
3 3
5 11
9 2
5 5
7 12
11 3
3 3
3 5
5 3
3 1
4 6
7 11
6 8
4 5
6 12
6 5
8 18
4 2
4 3
2 4
2 4
4 3
4 8
2 2
6 7
2 4
6 2
1 4
8 7
4...

output:

Yes
8 2
6 2
5 6
7 5
9 7
1 9
3 2
4 3
10 3
Yes
6 8
3 6
7 3
4 7
9 3
1 3
5 1
2 8
Yes
6 8
12 6
7 12
11 7
3 11
5 3
4 5
2 4
10 2
9 2
1 3
Yes
4 8
2 4
6 2
7 6
5 7
3 5
1 4
Yes
7 8
5 7
1 5
2 1
3 2
4 3
9 2
6 5
Yes
6 2
4 6
1 4
9 1
7 1
3 2
10 2
8 10
5 2
Yes
5 4
3 5
1 3
7 1
6 7
2 6
Yes
6 12
2 6
8 2
7 8
10 7
9 10
1...

result: