1、问题描述
2、本题如果对于小数据集的话仅用数组来记录边即可,考虑到要判断多个点之间的最短路,故考虑用Floyd算法来求,该算法在点组更多的情况下会更有价值,然后就是对每条边进行取舍来形成一个二叉树形式的决策树。递归求解问题
#include <iostream>
#include<cmath>
#include<cstring>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define maxn 3000+2
#define inf 3000
int a[maxn][maxn];
int b[maxn][maxn];
int m,n;
int s1,s2,t1,t2,l1,l2;
int maxl;
void compute(){
memcpy(a,b,sizeof(a));
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
}
int dfs(int l,int k){
if(l==n&&k==n)return 0;
for(int i=l;i<=n;i++){
for(int j=k;j<=n;j++){
if(b[i][j]==1){
b[i][j]=0;
compute();
if(a[s1][t1]<=l1&&a[s2][l2]<=l2){
if(j!=n)maxl=max(maxl,dfs(i,j+1)+1);
if(j==n)maxl=max(maxl,dfs(i+1,1)+1);
}
b[i][j]=1;
compute();
if(j!=n)maxl=max(maxl,dfs(i,j+1));
if(j==n)maxl=max(maxl,dfs(i+1,1));
return maxl;
}
}
}
}
int main(int argc, char** argv) {
cin>>n>>m;
memset(b,inf,sizeof(b));
while(m--){
int x,y;
cin>>x>>y;
b[x][y]=1;
}
cin>>s1>>t1>>l1>>s2>>t2>>l2;
cout<<dfs(1,1);
return 0;
}