이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <algorithm>
#include <queue>
using namespace std;
#define in ({int x=0;int c=getchar(),n=0;for(;!isdigit(c);c=getchar()) n=(c=='-');for(;isdigit(c);c=getchar()) x=x*10+c-'0';n?-x:x;})
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rnd(int l,int r){return l+rng()%(r-l+1);}
#define fasty ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define fori(x,a,b) for(int x=a;x<=b;x++)
#define ford(x,a,b) for(int x=a;x>=b;x--)
#define forv(a,b) for(auto&a:b)
#define fi first
#define se second
//#define int long long
#define pb push_back
#define ll long long
#define ii pair<int,int>
#define mt make_tuple
#define all(a) a.begin(),a.end()
#define reset(f,x) memset(f,x,sizeof(f))
#define getbit(x,i) ((x>>(i))&1)
#define batbit(x,i) (x|(1ll<<(i)))
#define tatbit(x,i) (x&~(1<<(i)))
using namespace std;
const int N = 5e4+ 5;
vector<pair<int,int> > a[N];
vector <int> b[N];
int parent[N], num[N], tout[N], low[N];
int ttime = 0;
int bridge[N], c[N], jointCnt = 0, bridgeCnt = 0;
int n, m, comp = 0;
int scc;
vector<int> bi[N];
stack<int> st;
int id[N];
void dfs(int u, int pre)
{
low[u] = num[u] = ++ttime;
st.push(u);
int child = 0;
for (auto e: a[u]){
int v = e.first;
int t = e.second;
if (pre == t) continue;
if (!num[v]){
parent[v] = u;
dfs(v,t);
low[u] = min(low[u], low[v]);
child++;
// Checking bridge
if (low[v] == num[v]){
bridge[v]++;
}
}
else{
low[u] = min(low[u], num[v]);
}
}
if (num[u] == low[u]){
scc++;
int v;
do{
v = st.top();
id[v] = scc;
bi[scc].push_back(v);
st.pop();
}
while (v != u);
}
}
signed main()
{
// freopen("task.inp","r",stdin);
ios_base::sync_with_stdio(false);cin.tie(NULL);
cin >> n; m = n - 1;
fori(i,1,m)
{
int u, v;
cin >> u >> v;
a[u].push_back({v, i});
a[v].push_back({u, i});
}
num[0] = 1e9;
fori(i,1,n)
if (num[i] == 0) dfs(i,0);
fori(i,1,n)
{
if (bridge[i]){
b[parent[i]].push_back(i);
b[i].push_back(parent[i]);
}
}
int cnt = 0;
vector<int> ans;
fori(i,1,n)
if (b[i].size() == 1 && (bi[id[i]].size() == 1)) ans.push_back(i);
if (ans.size() == 0) return cout << 0, 0;
if (ans.size() == 1)
fori(i,1,n)
if (ans[0] != i) return cout << 1 << "\n" << i << " " << ans[0] << "\n", 0;
cout << (ans.size() + 1)/2 << "\n";
ans.push_back(ans[0]);
for (int i = 0; i < ans.size() - 1; i += 2){
cout << ans[i] << " " << ans[i + 1] << "\n";
}
}
컴파일 시 표준 에러 (stderr) 메시지
net.cpp: In function 'int main()':
net.cpp:117:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
117 | for (int i = 0; i < ans.size() - 1; i += 2){
| ~~^~~~~~~~~~~~~~~~
net.cpp:105:6: warning: unused variable 'cnt' [-Wunused-variable]
105 | int cnt = 0;
| ^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |