Two Paths CodeForces - 14D【dfs 树的直径】

传送门

分析

刚开始的时候想的是求最长路和次长路,没有注意到题目中的条件是要求2条路不能交叉(2条路不能有公共的城市)。于是乎,就枚举边,把边删掉,然后在每个块里面求最长路。

刚开始想用spfa,把每条边的边权取反,求最短路,然后打着打着发现这么要枚举s,t,正解应该打树的直径(n个城市,n-1条边,联通,删去一条边之后就是2棵树)

写图论习惯了vector邻接表,然而这道题数据范围只有200,可以写邻接矩阵在“删边”的时候更方便。

//求2条不相交的最长路
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 205
#define INF 0x3f3f3f3f
#define LL long long
vector<pair<int,int> > G[MAXN];
int n,ans;
int d[MAXN];
bool vis[MAXN];
bool mark[MAXN][MAXN];
void dfs(int u,int x,int y)
{
	vis[u]=1;
	for(int i=0;i<G[u].size();i++)
	{
		int v=G[u][i].first,w=G[u][i].second;
		if((u==x&&v==y)||(u==y&&v==x)) continue;
		if(!vis[v])
		{
			d[v]=d[u]+w;//一个节点最多更新一次,放在vis判断里面防止重复更新父节点
			dfs(v,x,y);
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d %d",&u,&v);
		G[u].push_back(make_pair(v,1));
		G[v].push_back(make_pair(u,1));
	}
	for(int i=1;i<=n;i++)
		for(int j=0;j<G[i].size();j++)
		{
			int v=G[i][j].first,ans1=0,ans2=0,mx=0,s=i;
			if(mark[i][v]) continue;
			mark[v][i]=1;
			
			memset(d,0,sizeof(d));
			memset(vis,0,sizeof(vis));
			dfs(i,i,v);
			for(int k=1;k<=n;k++)
				if(d[k]>mx) mx=d[k],s=k;
			memset(d,0,sizeof(d));
			memset(vis,0,sizeof(vis));
			dfs(s,i,v);
			for(int k=1;k<=n;k++)
				if(d[k]>ans1) ans1=d[k];
			
			memset(d,0,sizeof(d));
			memset(vis,0,sizeof(vis));
			dfs(v,i,v);
			s=v,mx=0;
			for(int k=1;k<=n;k++)
				if(d[k]>mx) mx=d[k],s=k;
			memset(d,0,sizeof(d));
			memset(vis,0,sizeof(vis));
			dfs(s,i,v);
			for(int k=1;k<=n;k++)
				if(d[k]>ans2) ans2=d[k];
					
			if(ans1*ans2>ans) ans=ans1*ans2;
		}
	printf("%d\n",ans);
	return 0;
}
### 关于 `rosdep` 命令中的依赖问题 当执行 `rosdep install --from-paths src --ignore-src --rosdistro=noetic -y` 出现依赖问题时,通常是因为某些软件包未被正确识别或安装。以下是可能的原因以及解决方案: #### 可能原因分析 1. **缺失的 ROS 软件包** 如果目标 ROS 发行版(如 Noetic)中不存在所需的依赖项,则可能导致错误。这可能是由于该发行版尚未支持特定功能所致[^1]。 2. **本地源码路径配置不完整** 使用 `--from-paths src` 参数指定的工作空间目录可能存在遗漏,或者其中的部分文件夹未能正确初始化为 Catkin 工作区的一部分[^4]。 3. **环境变量设置不当** 若 `$ROS_DISTRO` 或其他相关环境变量未正确定义,可能会导致 rosdep 错误解析依赖关系[^2]。 4. **缓存数据陈旧** Rosdep 的内部数据库有时会因更新滞后而无法及时反映最新可用资源状态,从而引发冲突警告[^3]。 #### 解决方案详解 ##### 方法一:强制忽略已存在的依赖并重新尝试安装 通过增加 `-i` 和 `-r` 标志来跳过已经存在但仍然报告失败的项目列表,并递归处理子模块内的额外需求。 ```bash rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y -i -r ``` 此操作特别适用于那些理论上应该满足却依旧提示异常的情况。 ##### 方法二:手动定位具体丢失组件后再补充至工作下 如果知道确切名称比如 zed_interfaces ,可以直接前往官方仓库克隆对应分支版本放入 src 文件夹内再运行原指令完成余下部分加载。 ```bash git clone https://github.com/<repo_name>.git ~/catkin_ws/src/zed_interfaces cd ~/catkin_ws/ rosdep install --from-paths src --ignore-src -r -y ``` 上述过程有助于针对个别顽固型外部库单独解决其关联难题。 ##### 方法三:清理现有索引重建映射表单 偶尔也需要考虑清除掉先前积累下来的残留记录以便获取更加精准的结果反馈。 ```bash sudo apt-get update && sudo apt-get upgrade rosdep update rm ~/.ros/rosdep/sources.cache/* rosdep init; rosdep update ``` 这些步骤能够帮助消除潜在干扰因素影响最终判断准确性. ### 总结建议 综合以上几种方式可以根据实际场景灵活选用最合适的手段应对不同类型的挑战状况;同时保持良好的维护习惯定期同步上游改动也是预防此类事件发生的重要措施之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值