제목 설명
문제 해결
사고
이 질문은 폭력 그것을하지?
솔루션
나는 폭력이 될 것이다!
#include<iostream>
#include<vector>
using namespace std;
int n,ans,sum,a[200005],f[200005];
vector<int>g[200005];
void dfs(int u,int fa) {
for(int i=0; i<g[u].size(); i++) {
int x=g[u][i];
for(int j=0; j<g[u].size(); j++) {
int y=g[u][j];
if(x==y)continue;
ans=max(ans,a[x]*a[y]);
sum=(sum+a[x]*a[y])%10007;
}
}
for(int i=0; i<g[u].size(); i++) {
int v=g[u][i];
if(v==fa)continue;
dfs(v,u);
}
}
int main() {
cin>>n;
for(int i=1; i<n; i++) {
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1; i<=n; i++)cin>>a[i];
dfs(1,0);
cout<<ans<<" "<<sum;
return 0;
}
시간 복잡도 : \ (O (N ^ -2) \)
점수 예상 : 60 점
해결 방법 2
고려 발견 결합 가중치 동시에 노드에 연결된 두 개의 노드로 형성된다
이러한 트리의 경우 :
그것의 결합 된 중량이다 ((1,3), (2,4), (4,5) \) \ 3 점 구성 순서화
우리는 각 노드를 통과해야하고, 다음에 연결된 점 모두를 통해, 당신은 공동 가중치를 찾을 수 있습니다.
최대 값을 위해, 우리는 최대 중량과에서 두 번째로 큰 무게를 찾을 필요
그리고 다소 번잡 한 첫 번째 공동 무게 동시에, 노드에있는 두 개의 노드에 연결되어 있으므로 모든 지점에 대한, 우리는 만에 모든 무게의 점과 광장을 연결하기 위해 필요하지만, 우리는 그들이이 연결된 지점을 뺀 제곱의 합의 값으로 바로 갈 것만큼, 공동 무게와 동일한 노드의 두 선택할 수 없습니다.
다음과 같이 코드입니다 :
#include<iostream>
#include<vector>
using namespace std;
int n;
long long ans,sum,a[200005];
vector<int>g[200005];
int main() {
cin>>n;
for(int i=1; i<n; i++) {
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1; i<=n; i++)cin>>a[i];
for(int u=1;u<=n;u++){
long long h1=0,h2=0,m1=0,m2=0;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
h1=h1+a[v],h2=h2+a[v]*a[v];
a[v]>m1?m2=m1,m1=a[v]:(a[v]>m2?m2=a[v]:0);
}
ans=max(ans,m1*m2);
sum=(sum+h1*h1-h2)%10007;
}
cout<<ans<<" "<<sum;
return 0;
}
시간 복잡도 : \ (O (N-) \)
점수 예상 : 100 점