题目 hdu2833 #include <bits/stdc++.h> using namespace std; const int maxn=5e5+5; typedef long long ll; const ll inf=1e9; const int N=305; int mp[N][N],dp[N][N],n,m;//DP[][]表示从i到j的经过点数 int main(){ while(~scanf("%d%d",&n,&m)){ if(n==0&&m==0)break; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if(i==j)dp[i][j]=1,mp[i][j]=0; else dp[i][j]=dp[j][i]=2,mp[i][j]=mp[j][i]=inf; } int a,b,c,A,B,C,D; for(int i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); if(mp[a][b]>c){ mp[a][b]=mp[b][a]=c; } } scanf("%d%d%d%d",&A,&B,&C,&D); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++){ if(mp[j][k]>mp[j][i]+mp[i][k]){ mp[j][k]=mp[j][i]+mp[i][k]; dp[j][k]=dp[j][i]+dp[i][k]-1; } else if(mp[j][k]==mp[j][i]+mp[i][k]){ dp[j][k]=max(dp[j][k],dp[j][i]+dp[i][k]-1); } } int ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(mp[A][i]+mp[i][j]+mp[j][B]==mp[A][B]&&mp[C][i]+mp[i][j]+mp[j][D]==mp[C][D]){ ans=max(ans,dp[i][j]); } printf("%d\n",ans); } }