E. Xenon's Attack on the Gangs,Codeforces Round #614 (Div. 2),树形dp

E. Xenon’s Attack on the Gangs

http://codeforces.com/contest/1293/problem/E
On another floor of the A.R.C. Markland-N, the young man Simon “Xenon” Jackson, takes a break after finishing his project early (as always). Having a lot of free time, he decides to put on his legendary hacker “X” instinct and fight against the gangs of the cyber world.

His target is a network of n small gangs. This network contains exactly n−1 direct links, each of them connecting two gangs together. The links are placed in such a way that every pair of gangs is connected through a sequence of direct links.

By mining data, Xenon figured out that the gangs used a form of cross-encryption to avoid being busted: every link was assigned an integer from 0 to n−2 such that all assigned integers are distinct and every integer was assigned to some link. If an intruder tries to access the encrypted data, they will have to surpass S password layers, with S being defined by the following formula:

S=∑1≤u<v≤nmex(u,v)
Here, mex(u,v) denotes the smallest non-negative integer that does not appear on any link on the unique simple path from gang u to gang v.

Xenon doesn’t know the way the integers are assigned, but it’s not a problem. He decides to let his AI’s instances try all the passwords on his behalf, but before that, he needs to know the maximum possible value of S, so that the AIs can be deployed efficiently.

Now, Xenon is out to write the AI scripts, and he is expected to finish them in two hours. Can you find the maximum possible S before he returns?

思路:首先,如果一条边的权值为0,那么所有经过这条边的路径权值都会加1,如果再将其相邻的一条边的权值赋为1,则所有经过这0,1两条边的路径权值都会再加上1,而其他路径不会有贡献,即只有连续的一条链有贡献(链的赋值为0,1,…,x)
现可以枚举所有链,设这条链为u,u1,…,v1,v,设长度为x,每条边的赋值有0,1,…,x-1,经过整条链增加的贡献很容易算出来,现考虑将链长缩短,有两种方式,即x-1赋给边(u,u1)或者(v,v1),对这两种赋值方法的贡献取max即可,可以每次将结果记录下来,复杂度为O( n 2 n^2 n2)

#include<bits/stdc++.h>
#define ll long long
#define MAXN 3005
using namespace std;
ll dp[MAXN][MAXN],sz[MAXN][MAXN];
int fa[MAXN][MAXN],head[MAXN],tot;
struct edge
{
	int v,nxt;
}edg[MAXN << 1];
inline void addedg(int u,int v)
{
	edg[tot].v = v;
	edg[tot].nxt = head[u];
	head[u] = tot++;
}
int n,rt;
inline void dfs(int u,int f)
{
	int v;
	sz[rt][u] = 1;
	fa[rt][u] = f;
	for(int i = head[u];i != -1;i = edg[i].nxt)
	{
		v = edg[i].v;
		if(v != f)
		{
			dfs(v,u);
			sz[rt][u] += sz[rt][v];
		}
	}
}
inline ll solve(int u,int v)
{
	if(dp[u][v] != -1) return dp[u][v];
	if(u == v) return 0;
	return dp[u][v] = sz[u][v] * sz[v][u] + max(solve(u,fa[u][v]),solve(v,fa[v][u]));
}
inline void init()
{
	tot = 0;
	memset(head,-1,sizeof(head));
	memset(dp,-1,sizeof(dp));
}
int main()
{
	while(~scanf("%d",&n))
	{
		init();
		int u,v;
		for(int i = 1;i < n;++i)
		{
			scanf("%d%d",&u,&v);
			addedg(u,v);
			addedg(v,u);
		}
		for(int i = 1;i <= n;++i)
			rt = i,dfs(i,i);
		ll ans = 0;
		for(int i = 1;i <= n;++i)
			for(int j = 1;j <= n;++j)
				ans = max(ans,solve(i,j));
		printf("%lld\n",ans);
	}
	return 0;
}
本项目是一个基于SSM(Spring+SpringMVC+MyBatis)框架和Vue.js前端技术的大学生第二课堂系统,旨在为大学生提供一个便捷、高效的学习和实践平台。项目包含了完整的数据库设计、后端Java代码实现以及前端Vue.js页面展示,适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 在功能方面,系统主要实现了以下几个模块:用户管理、课程管理、活动管理、成绩管理和通知公告。用户管理模块支持学生和教师的注册、登录及权限管理;课程管理模块允许教师上传课程资料、设置课程时间,并由学生进行选课;活动管理模块提供了活动发布、报名和签到功能,鼓励学生参与课外实践活动;成绩管理模块则用于记录和查询学生的课程成绩和活动参与情况;通知公告模块则实时发布学校或班级的最新通知和公告。 技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,确保了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提升了用户体验和开发效率。 该项目不仅提供了完整的源代码和相关文档,还包括了详细的数据库设计文档和项目部署指南,为学习和实践提供了便利。对于基础较好的学习者,可以根据自己的需求在此基础上进行功能扩展和优化,进一步提升自己的技术水平和项目实战能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值