CF543B Destroying Roads 枚举 + 思维 + BFS

本文详细介绍了使用C++实现的一种图遍历算法,通过广度优先搜索(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值