| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 124199 | Adhyyan1252 | Izlet (COI19_izlet) | C++11 | 913 ms | 101496 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
//https://oj.uz/problem/view/COI19_izlet
using namespace std;
vector<vector<int> > g, a;
int n; 
struct dsu{
	vector<int> par;
	int sz;
	
	dsu(int size){
		sz = size;
		par = vector<int>(size, -1);
	}
	
	int find(int cur){
		if(par[cur] == -1) return cur;
		return par[cur] = find(par[cur]);
	}
	
	bool merge(int a, int b){
		a = find(a);
		b = find(b);
		if(a == b) return false;
		par[b] = a;
		return false;
	}
};
vector<int> col;
vector<vector<int> > ans;
vector<int> f;
int ncol = -1;
void dfs2(int cur, int par, int lead){
	if(par != -1 && f[col[cur]] == 0 && a[lead][cur] == a[lead][par]){
		//found the new color
		ncol = col[cur];
		return;
	}
	if(par != -1)f[col[cur]]++;
	for(int u: ans[cur]){
		if(u == par) continue;
		if(ncol != -1) break;
		dfs2(u, cur, lead);
	}
	if(par != -1)f[col[cur]]--;
}
int diff = 0;
void dfs1(int cur){
	
	//first figure out its color
	ncol = -1;
	dfs2(cur, -1, cur);
	if(ncol == -1){
		col[cur] = diff; diff++;
	}else{
		col[cur] = ncol;
	}
	for(int u: g[cur]){
		if(col[u] == -1){ //unvisited
			ans[cur].push_back(u);
			ans[u].push_back(cur);
			dfs1(u);
		}
	}
}
int main(){
	ios::sync_with_stdio(false); cin.tie(0);
	int sub; cin>>sub;
	cin>>n;
	a = vector<vector<int> > (n, vector<int>(n));
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			cin>>a[i][j];
		}
	}
	
	dsu same(n);
	for(int i = 0; i < n; i++){
		for(int j = i+1; j < n; j++){
			if(a[i][j] == 1){
				same.merge(i, j);
			}
		}
	}
	//cerr<<"MERGING DONE"<<endl;
	g.resize(n);
	for(int i = 0; i < n; i++){
		for(int j = i+1; j < n; j++){
			int id = same.find(i);
			int jd = same.find(j);
			if(id == jd) continue;
			if(id != i || jd != j) continue;
			if(a[id][jd] == 2){
				g[id].push_back(jd);
				g[jd].push_back(id);
			}
		}
	}
	//cerr<<"NEW GRAPH MADE"<<endl;
	col = vector<int>(n, -1);
	ans.resize(n);
	f.resize(n);
	dfs1(0);
//	for(int i = 0; i < n; i++){
//		if(same.find(i) != i) continue;
//		cout<<i<<" "<<col[i]<<" : : ";
//		for(int u: ans[i]){
//			cout<<u<<" ";
//		}
//		cout<<endl;
//	}
	vector<pair<int, int> > tree;
	for(int i = 0; i < n; i++){
		if(i != same.find(i)) continue;
		for(int u: ans[i]){
			if(u > i) tree.push_back({u, i});
		}
	}
	for(int i = 0; i < n; i++){
		if(i == same.find(i)) continue;
		tree.push_back({i, same.find(i)});
		col[i] = col[same.find(i)];
	}
	
	for(int i = 0; i < n; i++){
		cout<<col[i]+1<<" ";
	}
	cout<<endl;
	assert(tree.size() == n-1);
	for(int i = 0; i < tree.size(); i++){
		cout<<tree[i].first+1<<" "<<tree[i].second+1<<endl;
	}
}
Compilation message (stderr)
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
