codeforces 14d 暴力

题意:给你一颗树,删掉一条边把它变成左右两颗子树,问左右子树直径的乘积最大是多少

题解:枚举边暴力求解即可

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int INF = 0x3f3f3f3f;
const int N = 210;

int n, dist[N], Max, Index;
bool vis[N], G[N][N];
void bfs(int s){
    memset(vis, false, sizeof(vis));
    vis[s] = true;
    dist[s] = 0;
    queue <int> Q;
    Q. push(s);
    while( Q. size() ){
        int p = Q. front();
        Q. pop();
        for(int i = 1; i <= n; i ++){
            if( !G[p][i] )continue;
            if( !vis[i] ){
                vis[i] = true;
                dist[i] = dist[p] + 1;
                Q. push(i);
                if(dist[i] > Max){
                    Max = dist[i];
                    Index = i;
                }
            }
        }
    }
}
int main(){
    int a[N], b[N];
    while(scanf("%d", &n) != EOF){
        memset(G, false, sizeof(G));
        for(int i = 1; i < n; i ++){
            scanf("%d %d", &a[i], &b[i]);
            G[a[i]][b[i]] = G[b[i]][a[i]] = true;
        }
        int Ans = 0;
        for(int i = 1; i < n; i ++){
            G[a[i]][b[i]] = G[b[i]][a[i]] = false;
            memset(dist, 0, sizeof(dist));
            Max = Index = 0;
            bfs(a[i]);
            bfs(Index);
            int ans = Max;
            memset(dist, 0, sizeof(dist));
            Max = Index = 0;
            bfs(b[i]);
            bfs(Index);
            Ans = max(Ans, ans * Max);
            G[a[i]][b[i]] = G[b[i]][a[i]] = true;
        }
        printf("%d\n", Ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/86559765
今日推荐