#include <bits/stdc++.h>
using namespace std;
struct dsu{
vector<int>root;
vector<int>siz;
vector<set<int>>childs;
dsu(int n){
root=vector<int>(n);
siz=vector<int>(n,1);
childs=vector<set<int>>(n);
iota(root.begin(),root.end(),0);
for(int i = 0;i<n;i++){
childs[i].insert(i);
}
}
bool unite(int x, int y){
x=findRoot(x);
y=findRoot(y);
if(x==y){
return 0;
}
if(siz[x]<siz[y]){
swap(x,y);
}
root[y]=x;
siz[x]+=siz[y];
for(int i : childs[y]){
childs[x].insert(i);
}
return 1;
}
int findRoot(int x){
if(x==root[x]){
return x;
}
return root[x]=findRoot(root[x]);
}
};
const int maxn=3e3+5;
vector<int>path;
dsu ds(maxn);
void dfs(int st, int p, int o, vector<int>(&g)[],int grid[][maxn]){
path.push_back(st);
if(st!=o&&grid[o][st]==grid[o][p]){
int lo = 0;
int hi = path.size()-1;
while(lo<hi){
int mid = (lo+hi)/2;
if(grid[path[mid]][st]==grid[path[mid]][p]){
lo=mid+1;
}
else{
hi=mid;
}
}
ds.unite(path[lo-1],st);
}
for(int i : g[st]){
if(i==p)
continue;
dfs(i,st,o,g,grid);
}
path.pop_back();
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int s;
cin >> s;
int n;
cin >> n;
int grid[n][maxn];
vector<int>g[n];
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
cin >> grid[i][j];
if(grid[i][j]==1){
if(ds.unite(i,j)){
g[i].push_back(j);
g[j].push_back(i);
}
}
}
}
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
if(grid[i][j]==2){
if(ds.unite(i,j)){
g[i].push_back(j);
g[j].push_back(i);
}
}
}
}
ds=dsu(n);
vector<int>path;
set<int>vis;
for(int i = 0;i<n;i++){
dfs(i,-1,i,g,grid);
}
for(int i = 0;i<n;i++){
cout << ds.findRoot(i)+1 << " ";
}
cout << "\n";
for(int i = 0;i<n;i++){
for(int j : g[i]){
if(j>i){
cout << i+1 << " " << j+1 << "\n";
}
}
}
return 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... |