连接:
点击打开链接
这个题目,我一开始没想明白,没有把最大考虑进去,直接dj做的。wa
后来去网上找了一下标答,才发现还有这种操作,后来发现dj的代码量实在是高出floyd一倍,索性用了floyd而且还好理解
代码:
#include <cstdio>
#include <cstring>
#define max(x,y) (x > y ? x : y)
#define MAX 302
#define INF 1000000000
using namespace std;
int dis[MAX][MAX],dp[MAX][MAX];
int n,m;
void flyod(){
for(int u=1;u<=n;u++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]>dis[i][u]+dis[u][j]){
dis[i][j]=dis[i][u]+dis[u][j];
dp[i][j]=dp[i][u]+dp[u][j];
}else if(dis[i][j]==dis[i][u]+dis[u][j]){
dp[i][j]=max(dp[i][u]+dp[u][j],dp[i][j]);
}
}
}
}
}
int main()
{
int a,b,l;
int s1,e1,s2,e2;
int ans;
//freopen("data.txt","r",stdin);
while(scanf("%d %d",&n,&m),(n+m)){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dis[i][j]= i==j ? 0 : INF;
dp[i][j]=0;
}
}
for(int i=0;i<m;i++){
scanf("%d %d %d",&a,&b,&l);
if(dis[a][b]>l){
dis[a][b]=dis[b][a]=l;
dp[a][b]=dp[b][a]=1;
}
}
scanf("%d %d %d %d",&s1,&e1,&s2,&e2);
flyod();
ans=-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dp[i][j]>ans && (dis[s1][e1] == dis[s1][i]+dis[i][j]+dis[j][e1])
&& (dis[s2][e2] == dis[s2][i]+dis[i][j]+dis[j][e2]) ){
ans=dp[i][j];
}
}
}
printf("%d\n",ans+1);
}
return 0;
}