이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); i++)
#define rng(i,l,r) for(int i=(l); i<(r); i++)
#define all(x) x.begin(),x.end()
using ll=long long;
const int INF=INT_MAX>>1;
#include "simurgh.h"
struct UnionFind{
int size;
vector<int> uf;
UnionFind(int sz):size(sz){
uf.resize(sz,-1);
}
int leader(int x){
if(uf[x]<0)return x;
uf[x]=leader(uf[x]);
return uf[x];
}
bool same(int x,int y){
return leader(x)==leader(y);
}
bool merge(int x,int y){
x=leader(x);
y=leader(y);
if(x==y)return false;
if(-uf[x]>-uf[y])swap(x,y);
uf[y]+=uf[x];
uf[x]=y;
return true;
}
};
std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v) {
vector<int> tree;
int m=u.size();
UnionFind uni(n);
rep(i,m){
if(uni.merge(u[i],v[i]))tree.emplace_back(i);
}
vector<int> ans;
int def=count_common_roads(tree);
vector<int> mark(m+1,0);
rep(i,n-1){
UnionFind uni(n);
int bef=tree[i];
rep(j,n-1){
if(i!=j)uni.merge(u[tree[j]],v[tree[j]]);
}
vector<pair<int,int>> num={{def,bef}};
bool checked=false;
rep(j,m){
if(j==bef)continue;
if(!uni.same(u[j],v[j])){
if(mark[j]!=0){
if(checked)continue;
checked=true;
}
tree[i]=j;
num.emplace_back(count_common_roads(tree),j);
if(mark[j]==-1)num.emplace_back(num.back().first+1,m);
tree[i]=bef;
}
}
sort(all(num));
for(auto &[v,j]:num){
//cout<<v<<" "<<j<<endl;
if(v==num.back().first)mark[j]=1;
else mark[j]=-1;
}
}
rep(i,m){
if(mark[i]==1)ans.emplace_back(i);
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |