码迷,mamicode.com
首页 > 其他好文 > 详细

14D-树形DP

时间:2014-08-26 13:32:16      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   ar   art   div   

找出树中2条不重复的路径使其路径长度乘积最大

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
using namespace std;
const int MAXN = 205;
typedef pair<int,int> Edge;
vector<Edge> adj[MAXN];
bool del[MAXN];
int st[MAXN], ed[MAXN];
int n;
void load() {
    scanf("%d", &n);
    for (int i = 1; i < n; ++i) {
        int a, b;
        scanf("%d%d", &a, &b);
        adj[a].push_back(make_pair(b,i));
        adj[b].push_back(make_pair(a,i));
        st[i] = a;
        ed[i] = b;
    }
}
int used[MAXN];
int dis[MAXN];
int farthest;
void dfs(int u) {
    used[u] = true;
    for (vector<Edge>::iterator itr = adj[u].begin(); itr != adj[u].end(); ++itr) {
        int v = itr->first;
        int id = itr->second;
        if (0 == del[id] && 0 == used[v]) {
            dis[v] = dis[u]+1;
            if (dis[v] > dis[farthest])
                farthest = v;
            dfs(v);
        }
    }
}
void work() {
    int ans = 0;
    for (int t= 1; t < n; ++t) {
        memset(used,0,sizeof(used));
        memset(dis,0,sizeof(dis));
        del[t] = true;
        farthest = st[t];
        dfs(st[t]);
        memset(used,0,sizeof(used));
        memset(dis,0,sizeof(dis));
        dfs(farthest);
        int tans = dis[farthest];

        memset(dis,0,sizeof(dis));
        memset(used,0,sizeof(used));
        farthest = ed[t];
        dfs(ed[t]);
        memset(dis,0,sizeof(dis));
        memset(used,0,sizeof(used));
        dfs(farthest);
        tans *= dis[farthest];
        if (tans > ans)
            ans = tans;
        del[t] = false;
    }
    printf("%d\n", ans);
}
int main() {
    load();
    work();
    return 0;
}

 

14D-树形DP

标签:style   blog   color   os   io   for   ar   art   div   

原文地址:http://www.cnblogs.com/Susake/p/3936994.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!