先用做的暴力,因为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;
}

洛谷 P5683 【[CSPJX2019]道路拆除】的更多相关文章

  1. 洛谷 P5019 铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...

  2. [NOIP2014] 提高组 洛谷P2296 寻找道路

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  3. NOIP2014 day2 T2 洛谷P2296 寻找道路

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  4. 洛谷 P1272 重建道路 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  5. 洛谷 P2505 [HAOI2012]道路 解题报告

    P2505 [HAOI2012]道路 题目描述 C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它 ...

  6. 洛谷P3639 [APIO2013] 道路费用 [生成树的特殊算法]

    题目传送门 道路费用 格式难调,题面就不放了. 分析: 这是一道要细(yan)心(jing)的生成树的好(gui)题. 首先我们看到$k$的范围非常小,那么我们就可以直接$2^k$枚举每一条加边是否选 ...

  7. 洛谷P2296 寻找道路 [拓扑排序,最短路]

    题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  8. 洛谷——P1907 设计道路

    P1907 设计道路 题目描述 Caesar远征高卢回来后,对你大加赞赏,他亲自来到Genoa视察. Genoa在你的建设下变得无比繁荣,由于财政收入的增加,你为城市修建了交通系统.古罗马的交通系统由 ...

  9. 洛谷P2052 [NOI2011]道路修建(树形DP)

    题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路. 每条道 ...

随机推荐

  1. Java实现 蓝桥杯 算法训练 Bit Compressor(暴力)

    试题 算法训练 Bit Compressor 问题描述 数据压缩的目的是为了减少存储和交换数据时出现的冗余.这增加了有效数据的比重并提高了传输速率.有一种压缩二进制串的方法是这样的: 将连续的n个1替 ...

  2. Java实现 LeetCode 632 最小区间(又是先序队列,官方给的是堆)

    632. 最小区间 你有 k 个升序排列的整数数组.找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中. 我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a ...

  3. Java实现 LeetCode 543. 二叉树的直径(遍历树)

    543. 二叉树的直径 给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过也可能不穿过根结点. 示例 : 给定二叉树 1 / \ 2 3 / ...

  4. Java实现 蓝桥杯 乘积最大

    输入输出样例 输入样例#1: 4 2 1231 输出样例#1: 62 import java.util.Scanner; public class chengjizuida { public stat ...

  5. PAT 福尔摩斯的约会

    大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明白了,字条上奇 ...

  6. CGLIB动态代理机制,各个方面都有写到

    CGLIB库介绍 代理提供了一个可扩展的机制来控制被代理对象的访问,其实说白了就是在对象访问的时候加了一层封装.JDK从1.3版本起就提供了一个动态代理,它使用起来非常简单,但是有个明显的缺点:需要目 ...

  7. 判断IP是否是IPV4

    bool isVaildIp(const char *ip) { int dots = 0; /*字符.的个数*/ int setions = 0; /*ip每一部分总和(0-255)*/ if (N ...

  8. list基本运用

    #include<iostream> #include<list> using namespace std; list<int>list1,list2; void ...

  9. JVM中堆的介绍

    一.堆的概述 一个JVM实例只有一个堆内存,堆也是Java内存管理的核心区域,堆在JVM启动的时候创建,其空间大小也被创建,是JVM中最大的一块内存空间,所有线程共享Java堆,物理上不连续的逻辑上连 ...

  10. 03 . Prometheus监控容器和HTTP探针应用

    Eeporter是什么及来源? 是什么? 广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter.而Exporter的一个实例称为target,如下所示,Prom ...