답안 #1049866

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1049866 2024-08-09T05:50:17 Z mychecksedad 슈퍼트리 잇기 (IOI20_supertrees) C++17
0 / 100
1 ms 348 KB
#include "supertrees.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define pb push_back
#define vi vector<int>
 

struct Dsu{
	vector<int> p, s;
	Dsu(int n){
		p.resize(n+1);
		s.resize(n+1,1);
		for(int i = 1; i <= n; ++i ) p[i]=i;
	}
	int find(int v){
		if(p[v] == v)return v;
		return p[v]=find(p[v]);
	}
	void merge(int a, int b){
		a = find(a);
		b = find(b);
		if(a != b){
			if(s[a]>s[b]) swap(a,b);
			p[a] = b;
			s[b] += s[a];
		}
	}
};
vector<vector<int>> P;
bool solve(vector<int> v, vector<vector<int>> &ans){
	for(int u: v){
		for(int x: v){
			if(P[u][x] == 0 || P[u][x] == 3){
				return 0;
			}
		}
	}
	vector<int> cycle;
	vector<vector<int>> onepiece;
	for(int i: v){
		bool fulltwo = 1;
		for(int j: v){
			if(i == j) continue;
			if(P[i][j] == 1){
				fulltwo = 0;
				onepiece.pb(vector<int>{i, j});
				// for(int k = 0; k < n; ++k){

				// }
			}
		}
		if(fulltwo) cycle.pb(i);
	}

	for(auto v: onepiece){
		for(int j = 0; j + 1 < v.size(); ++j){
			ans[v[j]][v[j + 1]] = ans[v[j + 1]][v[j]] = 1;
		}
		cycle.pb(v[0]);
	}
	for(int i = 0; i < cycle.size(); ++i){
		ans[cycle[i]][cycle[(i + 1) % cycle.size()]] = ans[cycle[(i + 1) % cycle.size()]][cycle[i]] = 1;
	}

	return 1;
}

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

	Dsu d(n);

	for(int i = 0; i < n; ++i){
		for(int j = 1; j < n; ++j){
			if(p[i][j] > 0) d.merge(i, j);
		}
	}

	vector<vector<int>> C(n);
	for(int i = 0; i < n; ++i){
		C[d.find(i)].pb(i);
	}
	for(auto v: C){
		bool ok = solve(v, answer);
		if(!ok) return 0;
	}


	build(answer);
	return 1;
}

Compilation message

supertrees.cpp: In function 'bool solve(std::vector<int>, std::vector<std::vector<int> >&)':
supertrees.cpp:57:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |   for(int j = 0; j + 1 < v.size(); ++j){
      |                  ~~~~~~^~~~~~~~~~
supertrees.cpp:62:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |  for(int i = 0; i < cycle.size(); ++i){
      |                 ~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB b[0][0] is not 0
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB b[0][0] is not 0
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB b[0][0] is not 0
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB b[0][0] is not 0
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB b[0][0] is not 0
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB b[0][0] is not 0
2 Halted 0 ms 0 KB -