比赛 |
近期练习题回顾 |
评测结果 |
AAAAAAAAAA |
题目名称 |
孙悟空 |
最终得分 |
100 |
用户昵称 |
梦那边的美好ET |
运行时间 |
1.801 s |
代码语言 |
C++ |
内存使用 |
16.72 MiB |
提交时间 |
2018-10-18 11:53:44 |
显示代码纯文本
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,f[510][510],a1,a2,a3,a4,s1=0,s2=0,d[510],ld=0,mp[510][510],ans=0,sum;
bool bk[510],a[1100][510],b[1100][510];
inline void dfs1(int p,int x){
if(x>f[a1][a2])return;
if(p==a2){
s1++;
for(int i=1;i<=ld;i++)a[s1][d[i]]=1;
return;
}
for(int i=1;i<=n;i++){
if(!bk[i]&&mp[p][i]!=999999){
bk[i]=1;d[++ld]=i;
dfs1(i,x+mp[p][i]);
bk[i]=0;--ld;
}
}
return;
}
inline void dfs2(int p,int x){
if(x>f[a3][a4])return;
if(p==a4){
s2++;
for(int i=1;i<=ld;i++)b[s2][d[i]]=1;
return;
}
for(int i=1;i<=n;i++){
if(!bk[i]&&mp[p][i]!=999999){
bk[i]=1;d[++ld]=i;
dfs2(i,x+mp[p][i]);
bk[i]=0;--ld;
}
}
return;
}
int main(){
freopen("sunwukong.in","r",stdin);
freopen("sunwukong.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
f[i][j]=999999;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a1,&a2,&a3);
f[a1][a2]=min(f[a1][a2],a3);
f[a2][a1]=f[a1][a2];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
mp[i][j]=f[i][j];
scanf("%d%d%d%d",&a1,&a2,&a3,&a4);
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
bk[a1]=1;d[++ld]=a1;dfs1(a1,0);ld--;bk[a1]=0;
bk[a3]=1;d[++ld]=a3;dfs2(a3,0);ld--;bk[a3]=0;
for(int i=1;i<=s1;i++){
for(int j=1;j<=s2;j++){
sum=0;
for(int k=1;k<=n;k++)if(a[i][k]&&b[j][k])++sum;
ans=max(ans,sum);
}
}
printf("%d",ans);
return 0;
}