제출 #823018

#제출 시각아이디문제언어결과실행 시간메모리
823018NothingXDConnecting Supertrees (IOI20_supertrees)C++17
65 / 100
173 ms30028 KiB
#include "supertrees.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

void debug_out(){cerr<<endl;}
template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T){
	cerr << H << ' ';
	debug_out(T...);
}

#define debug(...) cerr << "(" << #__VA_ARGS__ << "): ", debug_out(__VA_ARGS__)
#define F first
#define S second
#define all(x) x.begin() x.end()
#define MP(x, y) make_pair(x, y)

const int maxn = 1e3 + 10;

int n, p[maxn][maxn], dsu[maxn], comp[maxn];
int ans[maxn][maxn];
vector<int> ver[maxn];
int getdsu(int v){
	return (dsu[v] == -1? v: dsu[v] = getdsu(dsu[v]));
}

void merge(int u, int v){
	if ((u = getdsu(u)) == (v = getdsu(v))) return;
	ans[u][v] = ans[v][u] = 1;
	dsu[u] = v;
}

bool merge2(int u, int v){
//	debug(u, v);
	u = comp[u], v = comp[v];
	if (u == v) return true;
	for (auto x: ver[u]){
		for (auto y: ver[v]){
			if (p[x][y] != 2) return false;
		}
	}
	for (auto x: ver[v]){
		if (x == v) continue;
		ver[u].push_back(x);
		comp[x] = u;
	}
	ver[u].push_back(v);
	comp[v] = u;
	return true;
}

int construct(vector<vector<int>> P) {
	n = P.size();
	for (int i = 0; i < n; i++){
		for (int j = 0; j < n; j++){
			p[i][j] = P[i][j];
		}
	}
	memset(dsu, -1, sizeof dsu);
	for (int i = 0; i < n; i++){
		for (int j = 0; j < n; j++){
			if (p[i][j] != p[j][i]) return 0;
			if (p[i][j] == 1) merge(i, j);
		}
	}
//	debug(1);
	for (int i = 0; i < n; i++){
		for (int j = 0; j < n; j++){
			if (p[i][j] == 2 && getdsu(i) == getdsu(j)) return 0;
		}
	}
//	debug(2);
	for (int i = 0; i < n; i++){
		int x = getdsu(i);
//		debug(i, x);
		ver[x].push_back(i);
		comp[i] = x;
	}
	for (int i = 0; i < n; i++){
		for (int j = 0; j < n; j++){
			if (p[i][j] == 2){
				if (!merge2(i, j)) return 0;
			}
		}
	}
//	debug(3);
	for (int i = 0; i < n; i++){
		ver[i].clear();
	}
	for (int i = 0; i < n; i++){
		if (dsu[i] == -1){
//			debug(i, comp[i]);
			ver[comp[i]].push_back(i);
		}
	}
	for (int i = 0; i < n; i++){
//		debug(i, ver[i].size());
		if (ver[i].size() < 2) continue;
		if (ver[i].size() == 2) return 0;
		for (int j = 1; j < ver[i].size(); j++){
			ans[ver[i][j-1]][ver[i][j]] = ans[ver[i][j]][ver[i][j-1]] = 1;
		}
		ans[ver[i][0]][ver[i].back()] = ans[ver[i].back()][ver[i][0]] = 1;
	}
//	debug(4);
	vector<vector<int>> res(n);
	for (int i = 0; i < n; i++){
		res[i].resize(n);
		for (int j = 0; j < n; j++){
			res[i][j] = ans[i][j];
		}
	}
	build(res);
	return 1;
}

컴파일 시 표준 에러 (stderr) 메시지

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:105:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |   for (int j = 1; j < ver[i].size(); j++){
      |                   ~~^~~~~~~~~~~~~~~
#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...