天天写算法之(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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值