This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "simurgh.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 501;
int vis[N] , vi = 0;
vector< pair<int,int> > g[N], T[N];
vector< int > ans;
bool ok[N * N] = {0} , asked[N * N];
int edge[N] , comp[N];
void gettree(int node,vector<int> &v,int prnt){
vis[node] = vi;
edge[node] = prnt;
for(int i=0;i<g[node].size();i++){
int newnode = g[node][i].first;
if(vis[newnode] != vi){
T[node].push_back(g[node][i]);
T[newnode].push_back(make_pair(node,g[node][i].second));
v.push_back(g[node][i].second);
gettree(newnode,v,g[node][i].second);
}
}
}
void DFS(int node,int cant,int cur){
vis[node] = vi;
comp[node] = cur;
for(int i=0;i<T[node].size();i++){
int newnode = T[node][i].first;
if(vis[newnode] != vi && newnode != cant){
DFS(newnode,cant,cur);
}
}
}
std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v) {
for(int i=0;i<u.size();i++){
g[u[i]].push_back(make_pair(v[i],i));
g[v[i]].push_back(make_pair(u[i],i));
}
vi++;
vector< int > tree;
gettree(0,tree,-1);
int res = count_common_roads(tree);
for(int i=0;i<n;i++){
if(edge[i] == -1) continue;
int cnt = 0 ;
vi++;
DFS(u[edge[i]],v[edge[i]],0);
DFS(v[edge[i]],u[edge[i]],1);
int ask = 0 , ask2 = 0 , mx = res ;
vector< pair<int,int> > v2;
v2.push_back(make_pair(res,edge[i]));
for(int j=0;j<u.size();j++){
if(j == edge[i]) continue;
if(comp[u[j]] == comp[v[j]]) continue;
if(asked[j] && ask == 0){
vector<int> r;
for(int k=0;k<tree.size();k++){
if(tree[k] != edge[i]){
r.push_back(tree[k]);
}
}
r.push_back(j);
ask2 = count_common_roads(r);
if(ok[j]) ask = 1; else ask = 2;
}
if(asked[j]) continue;
vector<int> r;
for(int k=0;k<tree.size();k++){
if(tree[k] != edge[i]){
r.push_back(tree[k]);
}
}
r.push_back(j);
int cur = count_common_roads(r);
v2.push_back(make_pair(cur,j));
mx = max(mx,cur);
}
if(ask == 0){
for(int j=0;j<v2.size();j++){
asked[v2[j].second] = true;
if(v2[j].first == mx) ok[v2[j].second] = true;
}
}
else if(ask == 1){
for(int j=0;j<v2.size();j++){
asked[v2[j].second] = true;
if(v2[j].first == ask2) ok[v2[j].second] = true;
}
}
else{
for(int j=0;j<v2.size();j++){
asked[v2[j].second] = true;
if(v2[j].first != ask2) ok[v2[j].second] = true;
}
}
}
for(int i=0;i<u.size();i++) if(ok[i]) ans.push_back(i);
return ans;
}
Compilation message (stderr)
simurgh.cpp: In function 'void gettree(int, std::vector<int>&, int)':
simurgh.cpp:15:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<g[node].size();i++){
^
simurgh.cpp: In function 'void DFS(int, int, int)':
simurgh.cpp:29:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<T[node].size();i++){
^
simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:38:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<u.size();i++){
^
simurgh.cpp:55:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int j=0;j<u.size();j++){
^
simurgh.cpp:60:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int k=0;k<tree.size();k++){
^
simurgh.cpp:71:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int k=0;k<tree.size();k++){
^
simurgh.cpp:82:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int j=0;j<v2.size();j++){
^
simurgh.cpp:88:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int j=0;j<v2.size();j++){
^
simurgh.cpp:94:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int j=0;j<v2.size();j++){
^
simurgh.cpp:48:7: warning: unused variable 'cnt' [-Wunused-variable]
int cnt = 0 ;
^
simurgh.cpp:100:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<u.size();i++) if(ok[i]) ans.push_back(i);
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |