이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
typedef long long int lld;
typedef pair<lld,lld> pii;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define trav(a,v) for(auto a:v)
vector<pii> nei[200000];
vector<pii> inv[200000];
set<int> leaves;
map<int,lld> tree[200000];
int n;
vector<int> V;
void correct(){
rep(i,0,n){
if(tree[i].size()==2){
//cout<<i<<endl;
trav(x,tree[i]){
V.push_back(x.first);
}
//cout<<V[0]<<" "<<V[1]<<endl;
lld go=tree[V[0]][i]+tree[i][V[1]];
lld come=tree[V[1]][i]+tree[i][V[0]];
tree[V[0]].erase(tree[V[0]].find(i));
tree[V[1]].erase(tree[V[1]].find(i));
tree[V[0]][V[1]]=go;
tree[V[1]][V[0]]=come;
V.clear();
tree[i].clear();
}
}
}
int view(){
pii best=pii(1000000000000000,-1);
trav(l,leaves){
//cout<<l<<endl;
pii travel=pii(-1,l);
lld ans=0;
while(tree[travel.second].size()==2 || travel.first==-1){
//if(travel.first==1)cout<<travel.first<<" "<<travel.second<<" "<<tree[travel.second].size()<<endl;
trav(u,tree[travel.second]){
if(travel.first!=u.first){
travel.first=travel.second;
travel.second=u.first;
ans+=u.second;
}
}
}
best=min(best,pii(ans,l));
//cout<<ans<<" "<<l<<endl;
}
return best.second;
}
bool visited[200000];
lld size[200000];
lld size2[200000];
void DFS(int node){
visited[node]=true;
size[node]=0;
trav(p,nei[node]){
if(!visited[p.first]){
DFS(p.first);
size[node]+=size[p.first]+p.second;
size2[p.first]=-p.second;
}
}
}
void DFS2(int node){
visited[node]=true;
trav(p,inv[node]){
if(!visited[p.first]){
//cout<<node<<" "<<p.first<<" "<<p.second<<endl;
size2[p.first]+=size2[node]+p.second;
DFS2(p.first);
}
}
}
void print(){
rep(i,0,n){
trav(p,tree[i]){
cout<<p.first<<","<<p.second<<" ";
}
cout<<endl;
}
}
int main(){
scanf("%d",&n);
rep(i,0,n-1){
int x,y;
lld z,w;
scanf("%d %d %lld %lld",&x,&y,&z,&w);
x--;y--;
tree[x][y]=w;
tree[y][x]=z;
nei[x].push_back(pii(y,z));
nei[y].push_back(pii(x,w));
inv[x].push_back(pii(y,w));
inv[y].push_back(pii(x,z));
}
rep(i,0,n){
if(tree[i].size()==1){
leaves.insert(i);
}
}
lld answer[n+1];
rep(i,leaves.size(),n){
answer[i]=0;
}
correct();
lld ans=0;
while(leaves.size()>2){
int u=view();
pii p=*tree[u].begin();
tree[u].clear();
ans+=p.second;
tree[p.first].erase(tree[p.first].find(u));
correct();
//cout<<tree[0].size()<<endl;
//print();
leaves.erase(u);
answer[leaves.size()]=ans;
//cout<<ans<<endl;
}
rep(i,0,n)visited[i]=false;
DFS(0);
size2[0]=size[0];
rep(i,0,n)visited[i]=false;
DFS2(0);
answer[1]=size2[0];
rep(i,0,n)answer[1]=min(answer[1],size2[i]);
int q;
scanf("%d",&q);
while(q--){
int x;
scanf("%d",&x);
printf("%lld\n",answer[x]);
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
designated_cities.cpp: In function 'int main()':
designated_cities.cpp:89:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&n);
~~~~~^~~~~~~~~
designated_cities.cpp:93:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d %lld %lld",&x,&y,&z,&w);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
designated_cities.cpp:136:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&q);
~~~~~^~~~~~~~~
designated_cities.cpp:139:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |