제출 #1295882

#제출 시각아이디문제언어결과실행 시간메모리
1295882AbdullahIshfaq슈퍼트리 잇기 (IOI20_supertrees)C++20
컴파일 에러
0 ms0 KiB
// GPT code // Supertrees - constructive solution for the sample grader format // Reads n and matrix p, prints 0 if impossible. // Otherwise prints 1 and an adjacency matrix b (0/1) for a valid simple undirected graph. // // Complexity: O(n^2), n <= 1000 #include "supertrees.h" #include <bits/stdc++.h> using namespace std; struct DSU { int n; vector<int> p; DSU(int n=0): n(n), p(n) { for(int i=0;i<n;i++) p[i]=i; } int find(int x){ return p[x]==x?x:p[x]=find(p[x]); } void unite(int a,int b){ a=find(a); b=find(b); if(a!=b) p[b]=a; } }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; if(!(cin>>n)) return 0; vector<vector<int>> p(n, vector<int>(n)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>p[i][j]; // Basic checks: symmetric, diagonal 1, values in [0,3] for(int i=0;i<n;i++){ if(p[i][i] != 1){ cout<<0<<"\n"; return 0; } for(int j=0;j<n;j++){ if(p[i][j] < 0 || p[i][j] > 3 || p[i][j] != p[j][i]){ cout<<0<<"\n"; return 0; } } } // If any 3 exists -> impossible per IOI analysis for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(p[i][j] == 3){ cout<<0<<"\n"; return 0; } // DSU-A: components for p>0 DSU comp(n); for(int i=0;i<n;i++) for(int j=i+1;j<n;j++){ if(p[i][j] > 0) comp.unite(i,j); } // collect nodes per component unordered_map<int, vector<int>> compNodes; for(int i=0;i<n;i++) compNodes[comp.find(i)].push_back(i); // verify consistency: inside a component all pairs must have p>0 for(auto &pr : compNodes){ auto &vec = pr.second; for(int a=0;a<(int)vec.size();a++){ for(int b=a+1;b<(int)vec.size();b++){ if(p[vec[a]][vec[b]] == 0){ cout<<0<<"\n"; return 0; } } } } // Build adjacency matrix b (initially all zero) vector<vector<int>> b(n, vector<int>(n,0)); // Process each component separately for(auto &pr : compNodes){ const vector<int> nodes = pr.second; if((int)nodes.size() == 1) continue; // single vertex, nothing to add // DSU-B: inside component, groups where p==1 (these become trees attached to cycle nodes) int m = nodes.size(); unordered_map<int,int> idx; for(int i=0;i<m;i++) idx[nodes[i]] = i; DSU group(m); for(int i=0;i<m;i++){ for(int j=i+1;j<m;j++){ int u = nodes[i], v = nodes[j]; if(p[u][v] == 1) group.unite(i,j); } } // collect groups unordered_map<int, vector<int>> groups; for(int i=0;i<m;i++) groups[group.find(i)].push_back(nodes[i]); // verify: pairs within group must have p==1 for(auto &gpr : groups){ auto &gvec = gpr.second; for(int a=0;a<(int)gvec.size();a++){ for(int b=a+1;b<(int)gvec.size();b++){ if(p[gvec[a]][gvec[b]] != 1){ cout<<0<<"\n"; return 0; } } } } int groupsCount = (int)groups.size(); if(groupsCount == 1){ // pure tree on nodes: make a simple path for(int i=0;i<m-1;i++){ int u = nodes[i], v = nodes[i+1]; b[u][v] = b[v][u] = 1; } continue; } // groupsCount >= 2: check cross-group pairs must be 2 // pick one representative per group vector<int> reps; reps.reserve(groupsCount); for(auto &gpr : groups) reps.push_back(gpr.second[0]); // check cross-group p values for(int i=0;i<groupsCount;i++){ for(int j=i+1;j<groupsCount;j++){ int a = reps[i], c = reps[j]; if(p[a][c] != 2){ cout<<0<<"\n"; return 0; } } } // groupCount == 2 is impossible (would require a 2-cycle / parallel edges) if(groupsCount == 2){ cout<<0<<"\n"; return 0; } // groupsCount >= 3: form a cycle on representatives for(int i=0;i<groupsCount;i++){ int u = reps[i]; int v = reps[(i+1) % groupsCount]; b[u][v] = b[v][u] = 1; } // for each group, attach other nodes of the group to its representative by star edges for(auto &gpr : groups){ int repnode = gpr.second[0]; for(size_t k=1;k<gpr.second.size();k++){ int v = gpr.second[k]; b[repnode][v] = b[v][repnode] = 1; } } } // All components processed successfully -> print adjacency cout<<1<<"\n"; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(j) cout<<" "; cout<<b[i][j]; } cout<<"\n"; } return 0; }

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

/usr/bin/ld: /tmp/ccem6yxO.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccjnsXsr.o:supertrees.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccem6yxO.o: in function `main':
grader.cpp:(.text.startup+0x2a6): undefined reference to `construct(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >)'
collect2: error: ld returned 1 exit status