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 <cstdio>
#include <vector>
#include <utility>
#include <cstring>
using namespace std;
typedef pair<int,int> ii;
ii p[50005][18];
vector<ii> al[50005];
int arr[5],memo[5][32];
void dfs(int i){
int j;
for (int x=0;x<al[i].size();x++){
if (p[al[i][x].first][0]==ii(-1,-1) && al[i][x].first){
p[al[i][x].first][0]=ii(i,al[i][x].second);
j=i;
for (int y=1;p[j][y-1]!=ii(-1,-1);y++){
p[al[i][x].first][y]=ii(p[j][y-1].first,p[j][y-1].second+p[al[i][x].first][y-1].second);
j=p[al[i][x].first][y].first;
}
dfs(al[i][x].first);
}
}
}
int dist(int i){
int k=0;
for (int x=17;x>=0;x--){
if (p[i][x]!=ii(-1,-1)){
k+=p[i][x].second;
i=p[i][x].first;
}
}
return k;
}
int level(int i){
int k=0;
for (int x=17;x>=0;x--){
if (p[i][x]!=ii(-1,-1)){
k+=(1<<x);
i=p[i][x].first;
}
}
return k;
}
int traverse(int i,int j){
for (int x=17;x>=0;x--){
if ((j&(1<<x))!=0){
i=p[i][x].first;
}
}
return i;
}
int lca(int i,int j){
if (level(j)>level(i)) swap(i,j);
i=traverse(i, level(i)-level(j));
if (i==j) return i;
for (int x=17;x>=0;x--){
if (p[i][x]!=ii(-1,-1) && p[i][x].first!=p[j][x].first){
i=p[i][x].first;
j=p[j][x].first;
}
}
return p[i][0].first;
}
int dist(int i,int j){
return dist(i)+dist(j)-2*dist(lca(i,j));
}
int tsp(int i,int bitmask){
if (memo[i][bitmask]!=-1) return memo[i][bitmask];
if (bitmask==31) return memo[i][bitmask]=dist(arr[i],arr[0]);
int ans=1000000000;
for (int x=1;x<5;x++){
if ((bitmask&(1<<x))==0){
ans=min(ans,dist(arr[i],arr[x])+tsp(x,bitmask|(1<<x)));
}
}
return memo[i][bitmask]=ans;
}
void print2(){
for (int x=0;x<5;x++){
for (int y=0;y<5;y++){
printf("%d %d %d\n",x,y,dist(x,y));
}
}
}
int main(){
int query,a,b,c;
scanf("%d",&query);
while (--query){
scanf("%d%d%d",&a,&b,&c);
al[a].push_back(ii (b,c));
al[b].push_back(ii (a,c));
}
memset(p,-1,sizeof(p));
dfs(0);
scanf("%d",&query);
while (query--){
memset(memo,-1,sizeof(memo));
for (int x=0;x<5;x++) scanf("%d",&arr[x]);
printf("%d\n",tsp(0,1)>>1);
}
}
Compilation message (stderr)
roadsideadverts.cpp: In function 'void dfs(int)':
roadsideadverts.cpp:12:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
12 | for (int x=0;x<al[i].size();x++){
| ~^~~~~~~~~~~~~
roadsideadverts.cpp: In function 'int main()':
roadsideadverts.cpp:87:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
87 | scanf("%d",&query);
| ~~~~~^~~~~~~~~~~~~
roadsideadverts.cpp:89:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
89 | scanf("%d%d%d",&a,&b,&c);
| ~~~~~^~~~~~~~~~~~~~~~~~~
roadsideadverts.cpp:95:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
95 | scanf("%d",&query);
| ~~~~~^~~~~~~~~~~~~
roadsideadverts.cpp:98:36: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
98 | for (int x=0;x<5;x++) scanf("%d",&arr[x]);
| ~~~~~^~~~~~~~~~~~~~
# | 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... |