问题标题: 酷町堂:6177 哈利波特

0
0
已解决
汪恺恒
汪恺恒
中级启示者
中级启示者

题目描述 Description

在哈利波特所在的巨大城堡内,有n座不同的城堡。有m条不同的长桥连接着其中的某些城堡。所有教学楼直接都可以互相到达。
现在校长施展魔法,可以在任意两座城堡之间建立传送门,使得两座城堡之间的距离为0。但是只能建立一个传送门。
现在试着求出建立传送门之后,所有城堡之间的最短路径长度之和的最小值。

输入描述 Input Description

第一行,两个空格隔开的整数,n m
接下来m行,每行三个空格隔开的整数,u v w,表示u和v两个城堡之间的桥的长度是w

输出描述 Output Description

一个整数,为建立传送门之后,所有城堡之间的最短路径长度之和的最小值

 

TLE 33,求优化

#include<iostream>
#include<bits/stdc++.h>
#define inf (1<<25)
#define reg register
using namespace std;
int n,m,ans=inf;
int f[105][105],g[105][105];
int Floyd(int u,int v){
    for(reg int i=1;i<=n;i++)
        for(reg int j=1;j<=n;j++)
            f[i][j]=g[i][j];
    f[u][v]=f[v][u]=0;
    for(reg int k=1;k<=n;k++)
        for(reg int i=1;i<=n;i++)
            for(reg int j=1;j<=n;j++)
                f[i][j]=min(f[i][k]+f[k][j],f[i][j]);   
    int sum=0;
    for(reg int i=1;i<=n;i++)
        for(reg int j=1;j<i;j++)
            sum+=f[i][j];
    return sum;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) g[i][j]=0;
            else g[i][j]=0x3f3f3f3f;
        }
    }
    while(m--){
        int u,v,w;
        cin>>u>>v>>w;
        g[u][v]=g[v][u]=w;
    }
    for(reg int k=1;k<=n;k++)
        for(reg int i=1;i<=n;i++)
            for(reg int j=1;j<=n;j++)
                g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
    for(reg int u=1;u<=n;u++){
        for(reg int v=1;v<u;v++){
            ans=min(ans,Floyd(u,v));
        }
    }
    cout<<ans;
    return 0;
}

 


0
已采纳
汪宇航
汪宇航
新手启示者
新手启示者

很多人看到这题,很多人会想到:贪心、动态规划以及多重背包,所以需要结合三点,利用动态规划的**质解决

这是我TLE78的思路,希望你改善后可以AC

0
0
0
我要回答