CF543B Destroying Roads 枚举 + 思维 + BFS

Code:

#include <bits/stdc++.h>
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 3002
using namespace std;
queue<int>Q;
vector<int>G[maxn];
int n,m,s1,t1,l1,s2,t2,l2;
int vis[maxn],d[maxn][maxn];
void bfs(int s) {
    memset(vis,0,sizeof(vis));
    d[s][s]=0,vis[s]=1,Q.push(s);
    while(!Q.empty()) {
        int u=Q.front(); Q.pop();
        for(int i=0;i<G[u].size();++i) {
            int v=G[u][i];
            if(!vis[v]) {
                vis[v]=1,d[s][v]=d[s][u]+1;
                Q.push(v);
            }
        }
    }
}
int main() {
    // setIO("input");
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i) {
        int a,b;
        scanf("%d%d",&a,&b);
        G[a].push_back(b), G[b].push_back(a);
    }
    memset(d,0x3f,sizeof(d));
    for(int i=1;i<=n;++i) d[i][i]=0;
    for(int i=1;i<=n;++i) bfs(i);
    scanf("%d%d%d%d%d%d",&s1,&t1,&l1,&s2,&t2,&l2);
    if(d[s1][t1] > l1 || d[s2][t2] > l2) printf("-1\n");
    else {
        int ans=d[s1][t1] + d[s2][t2];
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j) {
                if(d[s1][i]+d[i][j]+d[j][t1]<=l1 && d[s2][i]+d[i][j]+d[j][t2]<=l2)
                {
                    ans=min(ans, d[s1][i]+d[s2][i]+d[i][j]+d[j][t1]+d[j][t2]);
                }
            }
        swap(s1,t1);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j) {
                if(d[s1][i]+d[i][j]+d[j][t1]<=l1 && d[s2][i]+d[i][j]+d[j][t2]<=l2)
                {
                    ans=min(ans, d[s1][i]+d[s2][i]+d[i][j]+d[j][t1]+d[j][t2]);
                }
            }
        printf("%d\n",m-ans);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/guangheli/p/11232632.html

时间: 2024-11-06 09:42:21

CF543B Destroying Roads 枚举 + 思维 + BFS的相关文章

[ACM] POJ 1753 Flip Game (枚举,BFS,位运算)

Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29921   Accepted: 12975 Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the

FZU 2150 枚举+BFS

题意 给个N*M的田地,有些地方是草地有些是空地,现在有两个小孩,开始放火.放火只能在草地上进行,并且第一块点火的草地烧掉不需要时间,且每一块着火的草地,每一秒都会点着烧掉周围四块草地.问两个小孩最少要多少时间能把这片田地上的草烧完.每个小孩只有一次放火机会. 分析 N , M 不会很大,直接枚举两个人点的草地位置,分别bfs,在所有解里取最小值即可. 代码1 /* When all else is lost the future still remains. */ /* You can be

Codeforces Round #302 (Div. 2) D. Destroying Roads 最短路 删边

题目:有n个城镇,m条边权为1的双向边让你破坏最多的道路,使得从s1到t1,从s2到t2的距离分别不超过d1和d2. #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue> #include <stack> #in

codeforces 544 D Destroying Roads 【最短路】

题意:给出n个点,m条边权为1的无向边,破坏最多的道路,使得从s1到t1,s2到t2的距离不超过d1,d2 因为最后s1,t1是连通的,且要破坏掉最多的道路,那么就是求s1到t1之间的最短路 用bfs求出任意两个顶点之间的距离, 如果d[s1][t1]>d1||d[s2][t2]>d2,那么不可能 然后就枚举重叠的区间(就像题解里面说的"H"形一样) 如果枚举区间是1--n,1--i的话,需要交换四次 如果枚举区间是1--n,1--n的话,则只需要交换一次就可以了 看的这一

Codeforces 543B Destroying Roads(最短路)

题意: 给定一个n个点(n<=3000)所有边长为1的图,求最多可以删掉多少条边后,图满足s1到t1的距离小于l1,s2到t2的距离小于l2. Solution: 首先可以分两种情况讨论: 1:假设最后留下的边是互不相交的两条路径.此时的答案是n-s1到t1的最短路径-s2到t2的最短路径. 2:假设最后留下的边有重合的一段,此时只要枚举重合的这一段的起点和终点,就可以判断.注意此时要考虑这两条路径经过枚举的两点的顺序. 限制的条件比较多,可以用来剪枝的条件也很多. 由于所有边的长度为1,用DF

CF851 D 枚举 思维

给出n个数,你可以对每个数把它变为0,或者增加1,分别需要花费x, y.问把所有数的GCD变为不为1的最小花费是多少. n的范围5x1e5,a[i]的范围1e6. 开始想通过枚举最终gcd值,然后通过判左右个数以及消费来二分,显然是愚蠢的想法,因为一个数在不同模数下余数并不单调阿! 实际上是枚举gcd值,首先a[i]只有1e6范围,预处理前缀和:cnt[i]表示前a[] < i的个数和,sum[i] 比i小的所有a[]的和. 这样在枚举gcd的倍数值时,只要找到gcd范围内的一个划分,小于该划分

Codeforces544D:Destroying Roads(最短路)

In some country there are exactly n cities and m bidirectional roads connecting the cities. Cities are numbered with integers from 1 to n. If cities a and b are connected by a road, then in an hour you can go along this road either from city a to cit

魔戒(思维+bfs)

Description 蓝色空间号和万有引力号进入了四维水洼,发现了四维物体--魔戒. 这里我们把飞船和魔戒都抽象为四维空间中的一个点,分别标为 "S" 和 "E".空间中可能存在障碍物,标为 "#",其他为可以通过的位置. 现在他们想要尽快到达魔戒进行探索,你能帮他们算出最小时间是最少吗?我们认为飞船每秒只能沿某个坐标轴方向移动一个单位,且不能越出四维空间. Input 输入数据有多组(数据组数不超过 30),到 EOF 结束. 每组输入 4

Codeforces543 B. Destroying Roads

传送门:>Here< 题意:给出一张无向图(边权为1),并给出两对起点和终点以及距离:s1,t1,l1; s2,t2,l2; 要求删除尽量多的边,使得dis(s1,t1)<=l1, dis(s2,r2)<=l2 解题思路 首先我们会发现,由于边权都为1,删去一些边,某两点间的最短路肯定会随着删的边越来越多而越来越长(捷径被删了) 因此我们会发现,要让边删的尽量多,最好最后只剩下最短路,其它边都剩下.换句话说,如果两条最短路不相交,那么最后只会剩下孤零零的两条链 于是我们会发现,我们