제출 #303962

#제출 시각아이디문제언어결과실행 시간메모리
303962AlanC슈퍼트리 잇기 (IOI20_supertrees)C++14
100 / 100
295 ms26360 KiB
#include "supertrees.h"
#include <vector>
#include <cstdio>
#define N 1005
using namespace std;

int n, cnt;

vector<vector<int>> answer, cp, e, cyc;
vector<int> s;
int v[N], in[N];
bool error = false;



void DFS(int x) {
	s.push_back(x);
	v[x] = 1;
	for (int i=0; i<n; i++)
		if (e[x][i] == 1 && !v[i])
			DFS(i);
}

void findTrees() {
	cnt = 0;
	cp.clear();
	for (int i=0; i<n; i++) v[i] = 0;
	for (int i=0; i<n; i++)
		if (!v[i]) {
			s.clear();		
			DFS(i);
			cp.push_back(s);
		}
}



void checkTrees() {
	for (int k=0; k<cp.size(); k++) {
		for (int i=0; i<cp[k].size(); i++)
			in[cp[k][i]] = k;
	}
	
	for (int k=0; k<cp.size(); k++) {
		for (int j=0; j<n; j++) {
			int last = -1;
			for (int i=0; i<cp[k].size(); i++) {
				int x = cp[k][i];
				if (in[x] == in[j]) {
					if (e[x][j] != 1) error = true;
				}
				else {
					if (last == -1) last = e[x][j];
					else if (last != e[x][j]) error = true;
				}
			}
		}
	}
}

void DFS_C(int x) {
	v[x] = 1;
	s.push_back(x);
	for (int i=0; i<cp.size(); i++)
		if (!v[i] && e[cp[x][0]][cp[i][0]] == 2)
			DFS_C(i);
}

void fixCycles() {
	cyc.clear();
	for (int i=0; i<cp.size(); i++) v[i] = 0;
	for (int i=0; i<cp.size(); i++)
		if (!v[i]) {
			s.clear();
			DFS_C(i);
			cyc.push_back(s);
		}
}


void checkCycles() {
	for (int k=0; k<cyc.size(); k++) {
		for (int i=0; i<cyc[k].size(); i++)
			for (int j=0; j<i; j++) {
				int x = cp[cyc[k][i]][0];
				int y = cp[cyc[k][j]][0];
				if (e[x][y] != 2 || e[y][x] != 2) error = true;
			}
	}
}

void check3() {
	for (int i=0; i<n; i++)
	for (int j=0; j<n; j++)
		if (e[i][j] == 3) error = true;
}


int construct(vector<vector<int>> p) {
	n = p.size();
	e = p;
	/*
	vector<vector<int>> answer;
	for (int i = 0; i < n; i++) {
		vector<int> row;
		row.resize(n);
		answer.push_back(row);
	}
	*/
	findTrees();
	checkTrees();
	if (error) return 0;
	fixCycles();
	checkCycles();
	if (error) return 0;
	
	check3();
	if (error) return 0;
	
	for (int i=0; i<n; i++) {
		vector<int> row;
		row.resize(n);
		answer.push_back(row);
	}
	for (int i=0; i<cp.size(); i++) {
		for (int j=0; j<cp[i].size()-1; j++) {
			int x = cp[i][j];
			int y = cp[i][j+1];
			answer[x][y] = answer[y][x] = 1;
		}
	}
	
	for (int i=0; i<cyc.size(); i++) {
		if (cyc[i].size() == 1) continue;
		if (cyc[i].size() == 2) error = true;
		for (int j=0; j<cyc[i].size(); j++) {
			int x = cp[cyc[i][j]][0];
			int y = cp[cyc[i][(j+1) % cyc[i].size()]][0];
			answer[x][y] = answer[y][x] = 1;
		}
	}
	
	if (error) return 0;
	
	build(answer);
	return 1;
}

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

supertrees.cpp: In function 'void checkTrees()':
supertrees.cpp:39:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |  for (int k=0; k<cp.size(); k++) {
      |                ~^~~~~~~~~~
supertrees.cpp:40:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |   for (int i=0; i<cp[k].size(); i++)
      |                 ~^~~~~~~~~~~~~
supertrees.cpp:44:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |  for (int k=0; k<cp.size(); k++) {
      |                ~^~~~~~~~~~
supertrees.cpp:47:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |    for (int i=0; i<cp[k].size(); i++) {
      |                  ~^~~~~~~~~~~~~
supertrees.cpp: In function 'void DFS_C(int)':
supertrees.cpp:64:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |  for (int i=0; i<cp.size(); i++)
      |                ~^~~~~~~~~~
supertrees.cpp: In function 'void fixCycles()':
supertrees.cpp:71:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |  for (int i=0; i<cp.size(); i++) v[i] = 0;
      |                ~^~~~~~~~~~
supertrees.cpp:72:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |  for (int i=0; i<cp.size(); i++)
      |                ~^~~~~~~~~~
supertrees.cpp: In function 'void checkCycles()':
supertrees.cpp:82:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |  for (int k=0; k<cyc.size(); k++) {
      |                ~^~~~~~~~~~~
supertrees.cpp:83:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |   for (int i=0; i<cyc[k].size(); i++)
      |                 ~^~~~~~~~~~~~~~
supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:125:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |  for (int i=0; i<cp.size(); i++) {
      |                ~^~~~~~~~~~
supertrees.cpp:126:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  126 |   for (int j=0; j<cp[i].size()-1; j++) {
      |                 ~^~~~~~~~~~~~~~~
supertrees.cpp:133:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  133 |  for (int i=0; i<cyc.size(); i++) {
      |                ~^~~~~~~~~~~
supertrees.cpp:136:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  136 |   for (int j=0; j<cyc[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...