天天写算法之(floyd+dp)wukong

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

猜你喜欢

转载自blog.csdn.net/qq_36616268/article/details/80516920