| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1289656 | eri16 | Connecting Supertrees (IOI20_supertrees) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "supertrees.h"
using namespace std;
void build(vector<vector<int>> v){
for (int i=0; i<v.size(); i++){
for (int j=0; j<v.size(); j++){
cout<<v[i][j]<<' ';
}
cout<<"\n";
}
}
vector <int> fc(int i, vector<vector<int>> p){
vector <int> tm;
for (int j=0; j<p.size(); j++){
if (p[i][j]==1){
tm.push_back(j);
}
}
return tm;
}
int ck(int i,vector<vector<int>> p, vector <int> vt){
int ans=1;
for (int j=0; j<vt.size(); j++){
if (p[i][vt[j]]==0){ans=0;}
}
return ans;
}
int construct(vector<vector<int>> p){
int n=p.size();
vector<vector<int>> arr(n);
for (int i=0; i<n; i++){
for (int j=0; j<n; j++){
if (p[i][j]!=p[j][i]){return 0;}
arr[i].push_back(0);
}
}
vector <vector<int>> tree(n);
vector <int> visited(n);
for (int i=0; i<n; i++){visited[i]=0;}
int k=0;
for (int i=0; i<n; i++){
vector <int> vtm;
if (visited[i]==0){
vtm=fc(i,p);
for (int i=0; i<vtm.size(); i++){
tree[k].push_back(vtm[i]);
}
k++;
}
}
for (int i=0; i<k; i++){
int ans=1;
for (int j=0; j<tree[i].size(); j++){
ans=ans*ck(tree[i][j],p,tree[i]);
}
if (ans==0){return 0;}
}
for (int i=0; i<k; i++){
for (int j=0; j<tree[i].size()-1; j++){
arr[tree[i][j]][tree[i][j+1]]=1;
arr[tree[i][j+1]][tree[i][j]]=1;
}
}
build(arr);
return 1;
}
