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; }

浙公网安备 33010602011771号