# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1140036 | brover29 | Bulldozer (JOI17_bulldozer) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "Ioi.h"
using namespace std;
using ll = long long;
const ll N=10005;
ll ans,msg[N];
ll pr[N],used[N];
vector<ll> g[N];
set<pair<ll,ll>>edges;
void dfs(ll v){
used[v]=1;
for(ll to:g[v]){
if(used[to])continue;
pr[to]=v;
dfs(to);
}
}void calc(ll v,ll i=0){
used[v]=1;
ans+=(1ll<<i)*msg[v];
for(ll to:g[v]){
if(used[to])continue;
//msg[to]=Move(to);
calc(to,i+1);
break;
}
}
long long Ioi(int n, int m, int U[], int VV[], int P, int V, int T) {
for(ll i=0;i<m;i++){
ll v=VV[i],u=U[i];
g[v].push_back(u);
g[u].push_back(v);
edges.insert({ U[i], VV[i] });
edges.insert({ VV[i], U[i] });
}for(ll i=0;i<n;i++)sort(g[i].begin(),g[i].end());
msg[P]=V;
dfs(P);
vector<ll>v;
ll s=0;
while(s!=P){
v.push_back(s);
s=pr[s];
}
reverse(v.begin(),v.end());
s=P;
for(ll i:v){
assert(edges.count({ s,i}));
/// msg[i]=Move(i);
s=i;
}for(ll i=0;i<n;i++)used[i]=0;
// calc(0);
return ans;
}