题意:n点m条边的无向联通图.给出(s1,t1,l1),(s2,t2,l2)
1<=n<=3000. n-1<=m<=min(3000,n*(n-1)/2). 问最多删除多少条边,使得s1到t1长度不超过l1,s2到t2长度不超过l2.
边最多只有3000条.删除边最多,保留的边尽量少.
假如p1,p2为(s1,t1),(s2,t2)的路径 并且长度都符合要求.
则保留的边个数为 |p1|+|p2|-|p1∪p2|.
暴力找路径TLE....
关键:两个路径p1,p2重叠的部分也是一条路径(i,j).
假如重叠部分为(i,j),(k,l).. 那么从s1,s2从j->k时走的是不相交路径,
设其长度为x,y 显然不如让s1,s2走同一条路径.这样保留的边z<x+y.
枚举重叠路径为(i,j),现在路径固定,为了保留的边最少,显然走最短路 BFS暴力预处理即可.
1<=n<=3000. n-1<=m<=min(3000,n*(n-1)/2). 问最多删除多少条边,使得s1到t1长度不超过l1,s2到t2长度不超过l2.
边最多只有3000条.删除边最多,保留的边尽量少.
假如p1,p2为(s1,t1),(s2,t2)的路径 并且长度都符合要求.
则保留的边个数为 |p1|+|p2|-|p1∪p2|.
暴力找路径TLE....
关键:两个路径p1,p2重叠的部分也是一条路径(i,j).
假如重叠部分为(i,j),(k,l).. 那么从s1,s2从j->k时走的是不相交路径,
设其长度为x,y 显然不如让s1,s2走同一条路径.这样保留的边z<x+y.
枚举重叠路径为(i,j),现在路径固定,为了保留的边最少,显然走最短路 BFS暴力预处理即可.
注意重叠路径为(i,j)时,有4种情况,(s1-i-j-t1,s2-j-i-t2)...etc.
#include <bits/stdc++.h>
using namespace std;
const int N=3e3+5,inf=1e9;
int n,m,s1,t1,s2,t2,l1,l2,d[N][N],dis[N];
bool vis[N];
vector<int> e[N];
void bfs(int s){
memset(vis,0,sizeof(vis));
queue<int> q;
for(int i=1;i<=n;i++) dis[i]=inf;
dis[s]=0,vis[s]=true,q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
if(!vis[v]){
vis[v]=true;
dis[v]=dis[u]+1;
q.push(v);
}
}
}
for(int i=1;i<=n;i++) d[s][i]=d[i][s]=dis[i];
}
bool check(int a,int b,int c,int D){
int d1=d[s1][a]+d[a][b]+d[b][t1];
int d2=d[s2][c]+d[c][D]+d[D][t2];
return d1<=l1&&d2<=l2;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
cin>>s1>>t1>>l1>>s2>>t2>>l2;
for(int i=1;i<=n;i++) bfs(i);
if(d[s1][t1]>l1||d[s2][t2]>l2){
cout<<-1<<'\n';
return 0;
}
int res=d[s1][t1]+d[s2][t2];
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(check(i,j,i,j)) res=min(res,d[s1][i]+d[i][j]+d[j][t1]+d[s2][i]+d[j][t2]);
if(check(i,j,j,i)) res=min(res,d[s1][i]+d[i][j]+d[j][t1]+d[s2][j]+d[i][t2]);
if(check(j,i,i,j)) res=min(res,d[s1][j]+d[j][i]+d[i][t1]+d[s2][i]+d[j][t2]);
if(check(j,i,j,i)) res=min(res,d[s1][j]+d[j][i]+d[i][t1]+d[s2][j]+d[i][t2]);
}
}
cout<<m-res<<'\n';
return 0;
}