专栏文章
题解:P5683 [CSP-J2019 江西] 道路拆除
P5683题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miqosv4u
- 此快照首次捕获于
- 2025/12/04 08:17 3 个月前
- 此快照最后确认于
- 2025/12/04 08:17 3 个月前
题意:
给定一个 个点 条边的无向图,问最多能删去多少边,能依旧使得 到 的距离不大于 并且 到 的距离不大于 。
如果不能,输出 。
样例

思考
最后剩下的边一定构成一棵树,因为所有的环显然都是可以删掉至少一条边的,让我们来思考一下这棵树是什么形状吧。
结果:最后一定是三条链 答案就是 了。
调整法证明:若存在 使得 变小就用 代替 就好了。
注意枚举 时要做好初始化,用 bfs 可以轻松做到 的单源最短路,一共枚举 次,且 同阶,时间复杂度显然是 的。
核心代码
代码将 压成了一维虽然这毫无作用
CPPvoid addedge()
{
int x=in(),y=in();
cnt++;
edge[cnt].to=y;
edge[cnt].nextt=head[x];
head[x]=cnt;
cnt++;
edge[cnt].to=x;
edge[cnt].nextt=head[y];
head[y]=cnt;
}
void bfs(int pos)
{
for (int i=1;i<=n;i++) vis[i]=false,f[i]=1e9;
f[pos]=0;p=1;q[p]=pos;last=1;vis[pos]=true;
while (p<=last)
{
for (int i=head[q[p]];i;i=edge[i].nextt)
{
if (!vis[edge[i].to])
{
f[edge[i].to]=f[q[p]]+1;
vis[edge[i].to]=true;
last++;
q[last]=edge[i].to;
}
}
p++;
}
}
signed main()
{
n=in();m=in();
for (int i=2;i<=n;i++) f[i]=-1;
for (int i=1;i<=m;i++) addedge();
s1=in();t1=in();s2=in();t2=in();
bfs(1);
for (int i=1;i<=n;i++) f1[i]=f[i];
if (f[s1]>t1||f[s2]>t2)
{
cout<<-1;
return 0;
}
for (int i=1;i<=n;i++)
{
bfs(i);
if (f1[i]+f[s1]<=t1&&f1[i]+f[s2]<=t2) ans=min(ans,f1[i]+f[s1]+f[s2]);
}
cout<<m-ans;
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...