不作死就不会死。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,x,y,s1,s2,t1,t2,ans=-100000000000;
ll dis1[10010],dis2[10010],dis3[10010],book[4010],cnt;
bool lj[3010][3010];
queue<ll> q,kong;
void bfs(){
q=kong;
dis1[1]=0;
q.push(1);
memset(book,0,sizeof(book));
book[1]=1;
while(!q.empty()){
ll jd=q.front();
q.pop();
for(int j=1;j<=n;j++){
if(book[j]==0 && lj[jd][j]){
q.push(j);
book[j]=1;
dis1[j]=dis1[jd]+1;
//cout<<j<<" "<<dis1[j]<<endl;
}
}
}
//cout<<endl;
return;
}
void bfs2(){
q=kong;
dis2[s1]=0;
q.push(s1);
memset(book,0,sizeof(book));
book[s1]=1;
while(!q.empty()){
ll jd=q.front();
q.pop();
for(int j=1;j<=n;j++){
if(book[j]==0 && lj[jd][j]){
q.push(j);
book[j]=1;
dis2[j]=dis2[jd]+1;
}
}
}
return;
}
void bfs3(){
q=kong;
dis3[s2]=0;
q.push(s2);
memset(book,0,sizeof(book));
book[s2]=1;
while(!q.empty()){
ll jd=q.front();
q.pop();
for(int j=1;j<=n;j++){
if(book[j]==0 && lj[jd][j]){
q.push(j);
book[j]=1;
dis3[j]=dis3[jd]+1;
}
}
}
return;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;
if(lj[x][y]==0) cnt++;
lj[x][y]=1;
lj[y][x]=1;
}
for(int i=1;i<=n;i++){
dis1[i]=100000000000;
dis2[i]=100000000000;
dis3[i]=100000000000;
}
cin>>s1>>t1>>s2>>t2;
bfs();
bfs2();
bfs3();
for(int i=1;i<=n;i++){
//cout<<dis1[i]<<" "<<dis2[i]<<" "<<dis3[i]<<endl;
if(dis1[i]+dis2[i]<=t1 && dis1[i]+dis3[i]<=t2){
ans=max(ans,m-(dis1[i]+dis2[i]+dis3[i]));
}
}
if(ans==-100000000000){
cout<<-1<<endl;
}
else{
cout<<ans<<endl;
}
return 0;
}
我判掉了重路,在代码中用 cnt 而非 m 来减,满分变 20。