P5683 [CSP-J2019 江西] 道路拆除

>>>三个点之间的最短路

>>>最短路+枚举间隔点

》》》可能有huan-》bfs dis[v]>dis[u]+1

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
//#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=3e3+10 ;

int head[maxn],to[maxn<<1],nxt[maxn<<1],tot;
int n,m,dis[10][maxn],s1,s2,t1,t2,ans=0x3f3f3f3f;
queue<int> q;

void add(int u,int v){
    to[++tot]=v,nxt[tot]=head[u],head[u]=tot;
}

void bfs(int rt,int *d)
{
    q.push(rt);d[rt]=0;
    while(q.size())
    {
        int u=q.front();q.pop();
        for(int i=head[u];i;i=nxt[i]){
            int v=to[i];
            if(d[v]>d[u]+1) d[v]=d[u]+1,q.push(v);
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    memset(dis,0x3f3f3f3f,sizeof(dis));
    
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int a,b;cin>>a>>b;
        add(a,b),add(b,a);
    }
    cin>>s1>>t1>>s2>>t2;

    bfs(1,dis[0]);bfs(s1,dis[1]);bfs(s2,dis[2]);
    for(int i=1;i<=n;i++)
    {
        if(dis[0][i]+dis[1][i]<=t1&&dis[0][i]+dis[2][i]<=t2)
            ans=min(ans,dis[0][i]+dis[1][i]+dis[2][i]);
    }
    
    if(ans==0x3f3f3f3f) ans=-1;
    else ans=m-ans;
    cout<<ans<<'\n';
    
    return 0;
}

 

posted @ 2023-09-03 10:07  JMXZ  阅读(166)  评论(0)    收藏  举报