QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#621763 | #6421. Degree of Spanning Tree | gates_orz | TL | 3ms | 3956kb | C++20 | 2.8kb | 2024-10-08 16:45:24 | 2024-10-08 16:45:24 |
Judging History
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...