문제 밸리 P1351 [연합] 웨이트 로스 솔루션

제목 설명

주제 링크

문제 해결

사고

이 질문은 폭력 그것을하지?

솔루션

나는 폭력이 될 것이다!

#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 점

추천

출처www.cnblogs.com/ezlmr/p/12288905.html