题目链接:点击打开链接
题意:给定一棵树
找2条点不重复的路径,使得两路径的长度乘积最大
思路:
1、为了保证点不重复,在图中删去一条边,枚举这条删边
2、这样得到了2个树,在各自的树中找最长链,即树的直径,然后相乘即可
#include #include #include #include #include #include #include #include #include #include #include using namespace std; #define N 220 struct Edge { int from, to, nex; bool hehe; }edge[N<<1]; int head[N], edgenum; void add(int u, int v){ Edge E={u,v,head[u],true}; edge[edgenum] = E; head[u] = edgenum ++; } int n; int dis[N]; void init(){ memset(head, -1, sizeof head); edgenum = 0; } int bfs(int x){ memset(dis, 0, sizeof dis); dis[x] = 1; queue q; q.push(x); int hehe = x; while(!q.empty()) { int u = q.front(); q.pop(); for(int i = head[u]; ~i; i = edge[i].nex) { if(!edge[i].hehe)continue; int v = edge[i].to; if(dis[v])continue; dis[v] = dis[u]+1, q.push(v); if(dis[hehe]