#include <cstdio>
#include <iostream>
#include <cassert>
#include <vector>
#include <cstdlib>
#include <string>
using namespace std;
static int MAXQ = 30000;
static int n, m, q = 0;
static vector<int> u, v;
static vector<bool> goal;
std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v);
int count_common_roads(const std::vector<int>& r);
bool isSubtask1(int n) {return n<=7;}
bool isSubtask2(int n) {return n<=50;}
bool isSubtask3(int n) {return n<=240;}
bool hasBackEdge(int parent, int now, std::vector<int>& visit, std::vector<vector<int>>& edgeL) {
visit[now]=1;
// printf("hasBackEdge: parent=%d, now=%d\n",parent,now);
// for(int i=0; i<visit.size() ;i++) printf("%d ",visit[i]); cout << endl;
for(int elem: edgeL[now]) {
if (elem==parent) continue;
if (visit[elem] || hasBackEdge(now,elem,visit,edgeL)) {/*printf("Edge: %d -> %d\n",now,elem);*/ return true;}
}
return false;
}
bool isTree(std::vector<int>& r, std::vector<int>& u, std::vector<int>& v) {
n = r.size()+1;
std::vector<vector<int>> edgeL(n);
for(int i=0; i<n-1; i++) {
int s = u[r[i]], e=v[r[i]];
edgeL[s].push_back(e);
edgeL[e].push_back(s);
}
// if (r[0] >=3) {
// cout << "edge numbers: "; for(int elem: r) cout << elem << " "; cout << endl;
// cout << "edge List\n";
// for(int i=0; i<n; i++) {
// printf("%d: ", i);
// for(int elem: edgeL[i]) printf("%d ",elem); cout << endl;
// }
// }
vector<int> visit(n,0);
if (hasBackEdge(-1,u[r[0]],visit,edgeL)) return false;
else {/* cout<< "isTree\n";*/ return true;}
}
bool selectEdges(int cnt, int start, int n, int m, std::vector<int>& r, std::vector<int>& u, std::vector<int>& v){
if (cnt == n-1){
if(isTree(r,u,v) && count_common_roads(r)==n-1) return true;
else return false;
}
for(int i=start; i<m; i++){
r[cnt] = i;
if (selectEdges(cnt+1,i+1,n,m,r,u,v)) return true;
}
return false;
}
std::vector<int> subtask1(int n, std::vector<int>& u, std::vector<int>& v) {
int m = u.size();
std::vector<int> r(n-1), zero(n-1,-1);
if (selectEdges(0,0,n,m,r,u,v)) return r;
else return zero;
}
std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v) {
// if (isSubtask1(n))
return subtask1(n,u,v);
}
Compilation message
simurgh.cpp:12:18: warning: 'q' defined but not used [-Wunused-variable]
12 | static int n, m, q = 0;
| ^
simurgh.cpp:12:15: warning: 'm' defined but not used [-Wunused-variable]
12 | static int n, m, q = 0;
| ^
simurgh.cpp:10:12: warning: 'MAXQ' defined but not used [-Wunused-variable]
10 | static int MAXQ = 30000;
| ^~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
348 KB |
WA in grader: NO |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
348 KB |
WA in grader: NO |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
348 KB |
WA in grader: NO |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
432 KB |
correct |
2 |
Incorrect |
42 ms |
348 KB |
WA in grader: NO |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
348 KB |
WA in grader: NO |
2 |
Halted |
0 ms |
0 KB |
- |