Submission #245677

#TimeUsernameProblemLanguageResultExecution timeMemory
245677dennisstarIzlet (COI19_izlet)C++17
100 / 100
935 ms82072 KiB
#include <bits/stdc++.h>
#define eb emplace_back
using namespace std;
using pii = pair<int, int>;

const int MX = 3e3 + 5;

int pr[MX];
int gp(int n) { return pr[n]?(pr[n]=gp(pr[n])):n; }
void un(int x, int y) {
	x=gp(x), y=gp(y);
	if (x!=y) pr[y]=x;
}

int T, N, mt[MX][MX], clr[MX], dst[MX][MX];
vector<int> stk;
vector<pii> a;

void dfs(int n, int p) {
	if (p) {
		pii mn(MX, 0);
		for (auto &i:stk) if (mt[i][n]==mt[i][p]) mn=min(mn, pii(dst[i][n], clr[i]));
		if (mn.second) clr[n]=mn.second;
		else clr[n]=++T;
	}else clr[n]=++T;

	stk.eb(n);
	for (int i=1; i<=N; i++) if (!clr[i]&&gp(i)==i&&mt[i][n]==2) {
		for (auto &j:stk) dst[i][j]=dst[j][i]=dst[n][j]+1;
		a.eb(n, i);
		dfs(i, n);
	}
}

int main() {
	cin.tie(0)->sync_with_stdio(0);
	cin>>T>>N;
	for (int i=1; i<=N; i++) for (int j=1; j<=N; j++) {
		cin>>mt[i][j];
		if (mt[i][j]==1) un(i, j);
	}

	dfs(gp(1), T=0);

	for (int i=1; i<=N; i++) cout<<clr[gp(i)]<<' ';
	cout<<'\n';
	for (auto &i:a) cout<<i.first<<' '<<i.second<<'\n';
	for (int i=1; i<=N; i++) if (gp(i)!=i) cout<<gp(i)<<' '<<i<<'\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...