洛谷 P5683 【[CSPJX2019]道路拆除】
2024-10-09 08:45:39
先用做的暴力,因为n最多才3000嘛,但是后来发现时间复杂度不止\(O\)(\({n}^2\)),然后就放弃了。
讲讲我的暴力+错误思路吧:
把1到s1和s2的最短路算出来,用SPFA,然后用DFS求出所有的最短路的路径,然后两两枚举,看哪个重合的点数最多,然后输出其他点所连接的边的个数。如果你这样想,那就跟我一样错了。仔细读题,我们求的是删除的最大,也就是保留的最小,保留的是总和,而不是每一个都是最短路,所以思路错了(所以我好弱弱弱弱弱啊)。
正解:
1到s1和1到s2当中,两条路径肯定是有公共点的(1也算的),那么我们只需要枚举公共点即可。先用SPFA算出1,s1,s2到每一个点的最短路,然后枚举公共点,从1到n,设ans为能够联通s1,s2需要的最少的边,i为当前枚举到的点,dis1为1到每一个点的最短路,dis2为s1到每一个点的最短路,dis3为s2到每一个点的最短路,那么枚举过程就应该为\(ans\)\(=\)\(min\)(\(ans\),\(dis1_i+dis2_i+dis3_i\))。
代码:SPFA没死
#include <bits/stdc++.h>
using namespace std;
int n , m , s1 , t1 , s2 , t2 , ans = 0x3fffff;
int vis[3010] , dis1[3010] , dis2[3010] , dis3[3010];
vector<int> e[3010];
int spfa(int x , int dis[]){
queue<int> q;
memset(vis , 0 , sizeof(vis));
q.push(x);
dis[x] = 0;
vis[x] = 1;
while(!q.empty()){
int xx = q.front();
q.pop();
vis[xx] = 0;
for(int i = 0; i < e[xx].size(); i++){
int y = e[xx][i];
if(dis[y] > dis[xx] + 1){
dis[y] = dis[xx] + 1;
if(!vis[y]){
vis[y] = 1;
q.push(y);
}
}
}
}
}
int main(){
cin >> n >> m;
for(int i = 1; i <= m; i++){
int x , y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
cin >> s1 >> t1 >> s2 >> t2;
for(int i = 1; i <= n; i++) dis1[i] = dis2[i] = dis3[i] = 0x3ffffff;
spfa(1 , dis1); //跑三次SPFA
spfa(s1 , dis2);
spfa(s2 , dis3);
if(dis1[s1] > t1 || dis1[s2] > t2){ //判断无法完成的情况
cout << -1;
return 0;
}
for(int i = 1; i <= n; i++)
ans = min(ans , dis1[i] + dis2[i] + dis3[i]);
cout << m - ans; //因为求的是删除的,所以要用总的减用的
return 0;
}
最新文章
- java基本知识小记(1)
- 基于DDD的.NET开发框架 - ABP依赖注入
- PHP public private protected 三种修饰符的区别
- 如何在ASP.Net中实现RSA加密
- django提供xml下载
- [leetcode] 399. Evaluate Division
- 【转】使用 udev 高效、动态地管理 Linux 设备文件
- 演练5-4:Contoso大学校园管理系统4
- 【转】Java 工程师成神之路
- 5_find grep sed awk 详解
- 放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?
- 【转载】MySQL5.7 添加用户、删除用户与授权
- Base包equivalent
- vim 批量替换使用说明
- Java线程机制学习
- UF清log
- MT7601 WG209模块驱动移植,并连接路由器
- java环境的配置与安装(windows、macos、linux)
- as3 代码优化
- Python Requests库简单入门
热门文章
- 蓝桥杯 算法训练 P0505(Java解法)
- Java实现 LeetCode 668 乘法表中第k小的数(二分)
- Java实现 LeetCode 553 最优除法(思路问题)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)
- Java基础(八)
- java第三阶段作业总结
- Py中去除列表中小于某个数的值
- 关于Attach *.mdf数据库联想到的备份
- LR脚本信息函数-lr_get_vuser_ip
- C# 加密、解密PDF文档(基于Spire.Cloud.SDK for .NET)