//暴力枚舉所有點爲起點的最小值
//然後枚舉每段<i,j>是否爲重疊區域。
//之前想枚舉每一小段,發現很麻煩,其實重疊的區域肯定只有一段,因爲如果有兩段,那麼這兩段一定是由最短的路連接的,實際還是一段。
//所以枚舉一大段即可
import java.io.*;
import java.util.*;
public class cf {
FastScanner in;
final int INF=0x3fffffff;
int[][] dis;
edge[] e;
int head[];
int cnt=0;
void addedge(int u,int v){
e[cnt]=new edge();
e[cnt].from=u;e[cnt].to=v;e[cnt].next=head[u];
head[u]=cnt++;
}
void input(){
in = new FastScanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
dis=new int[3010][3010];
e=new edge[6010];
head=new int[3010];
cnt=0;
Arrays.fill(head, -1);
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
dis[i][j]=INF;
for(int i=0;i<m;i++){
int u=in.nextInt();
int v=in.nextInt();
addedge(u,v);
addedge(v,u);
}
int s1=in.nextInt();
int t1=in.nextInt();
int l1=in.nextInt();
int s2=in.nextInt();
int t2=in.nextInt();
int l2=in.nextInt();
for(int i=1;i<=n;i++){
bfs(i);// calculate everypoint's shortest distance
}
int ans=-1;
if(dis[s1][t1]<=l1&&dis[s2][t2]<=l2){
ans=m-dis[s1][t1]-dis[s2][t2];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)continue;
if(dis[s1][i]+dis[i][j]+dis[j][t1]<=l1&&dis[s2][i]+dis[i][j]+dis[j][t2]<=l2){
ans=Math.max(ans,m-dis[s1][i]-dis[s2][i]-dis[i][j]-dis[j][t1]-dis[j][t2]);
}
if(dis[t1][i]+dis[i][j]+dis[j][s1]<=l1&&dis[s2][i]+dis[i][j]+dis[j][t2]<=l2){
ans=Math.max(ans,m-dis[t1][i]-dis[s2][i]-dis[i][j]-dis[j][s1]-dis[j][t2]);
}
}
}
}
System.out.println(ans);
}
void bfs(int s){
int Q[]=new int[3010];
int front,rear;
front=rear=0;
boolean vis[]=new boolean[3010];
Q[rear++]=s;vis[s]=true;
dis[s][s]=0;
while(front!=rear){
int k=Q[front++];
for(int i=head[k];i!=-1;i=e[i].next){
int v=e[i].to;
if(vis[v]==false){
vis[v]=true;
Q[rear++]=v;
dis[s][v]=dis[s][k]+1;
}
}
}
}
public static void main(String[] args){
new cf().input();
}
}
class edge{
int from,to,next;
}
class FastScanner {
BufferedReader br;
StringTokenizer st;
public FastScanner(File f) {
try {
br = new BufferedReader(new FileReader(f));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public FastScanner(InputStream f) {
br = new BufferedReader(new InputStreamReader(f));
}
String next() {
while (st == null || !st.hasMoreTokens()) {
String s = null;
try {
s = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if (s == null)
return null;
st = new StringTokenizer(s);
}
return st.nextToken();
}
boolean hasMoreTokens() {
while (st == null || !st.hasMoreTokens()) {
String s = null;
try {
s = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if (s == null)
return false;
st = new StringTokenizer(s);
}
return true;
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
String nextLine() {
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
codeforces543B. Destroying Roads(暴力枚舉bfs)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.