连接:
点击打开链接
这个题目,我一开始没想明白,没有把最大考虑进去,直接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; }