比赛 近期练习题回顾 评测结果 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;
}