제출 #1204471

#제출 시각아이디문제언어결과실행 시간메모리
1204471bangan슈퍼트리 잇기 (IOI20_supertrees)C++20
21 / 100
127 ms30320 KiB
#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define rep(i,l,r) for (int i=(l); i<=(r); i++)

const int N = 1e3 + 4;

int R[N];
bool vis[N];
vector<int> A;
vector<int> adj[N], tree[N];

void set_root(int v) {
	vis[v]=1; A.pb(v);
	tree[R[v]].pb(v);
	for (int u : adj[v]) if (!vis[u]) {
		R[u]=v; set_root(u);
	}
}

void find_cyc(int v) {
	vis[v]=1; A.pb(v);
	for (int u : adj[v]) if (!vis[u]) find_cyc(u);
}

int construct(std::vector<std::vector<int>> p) {
	int n = p.size();
	vector ans(n, vector<int>(n));

	rep(i, 0, n-1) {
		if (p[i][i]!=1) return 0;
		rep(j, 0, n-1) if (p[i][j]!=p[j][i] || p[i][j]==3) return 0;
	}

	rep(i, 0, n-1) rep(j, 0, n-1) if (p[i][j]==1) adj[i].pb(j), adj[j].pb(i);
	rep(i, 0, n-1) if (!vis[i]) {
		R[i]=i; set_root(i);
		for (int v:A) for (int u:A) if (p[v][u]!=1 || p[u][v]!=1) return 0;
		for (int i=0; i+1 < A.size(); i++) ans[A[i]][A[i+1]] = ans[A[i+1]][A[i]] = 1;
		A.clear();
	}

	rep(i, 0, n-1) adj[i].clear(), vis[i]=0;
	rep(i, 0, n-1) rep(j, 0, n-1) if (p[i][j]==2) adj[R[i]].pb(R[j]), adj[R[j]].pb(R[i]);

	rep(i, 0, n-1) if (!vis[i]) {
		find_cyc(i);
		if (A.size()==1) {A.clear(); continue;}
		else if (A.size()==2) return 0;
		
		A.pb(A[0]);
		vector<int> cyc=A; A.clear();

		for (int v:cyc) for (int u:tree[v]) A.pb(u);
		// for (int v:A) for (int u:A) if (R[v]!=R[u] && p[v][u]!=2) return 0;
		for (int i=0; i+1 < cyc.size(); i++) ans[cyc[i]][cyc[i+1]] = ans[cyc[i+1]][cyc[i]] = 1;
		A.clear();
	}

	build(ans); return 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...