Codeforces25 C. Roads in Berland(floyd插点)

题意:

给定n个点的带权无向图,保证图联通
接下来q次操作,每次操作给出一条边,在原图中加入这条边,然后问图中所有点对的最短路径和是多少

数据范围:n,k<=300

解法:

因为要计算所有点对的最短路径和,而且只有300个点,那么肯定floyd
q次操作用floyd插点法就行了

要注意的是,用floyd插点法的时候,两层循环都必须从1开始,第二层不能从i+1开始(我也不知道为什么)

code:

#include
using namespace std;
#define int long long
const int maxm=305;
int d[maxm][maxm];
signed main(){
     
    int n;cin>>n;
    for(int i=1;i<=n;i++){
     
        for(int j=1;j<=n;j++){
     
            cin>>d[i][j];
        }
    }
    int q;cin>>q;
    while(q--){
     
        int a,b,c;cin>>a>>b>>c;
        d[b][a]=d[a][b]=min(d[a][b],c);
        for(int i=1;i<=n;i++){
     
            for(int j=1;j<=n;j++){
     
                d[j][i]=d[i][j]=min(d[i][j],d[i][a]+d[a][j]);
                d[j][i]=d[i][j]=min(d[i][j],d[i][b]+d[b][j]);
            }
        }
        int sum=0;
        for(int i=1;i<=n;i++){
     
            for(int j=1;j<=n;j++){
     
                sum+=d[i][j];
            }
        }
        cout<<sum/2<<' ';
    }
    return 0;
}

你可能感兴趣的:(Codeforces25 C. Roads in Berland(floyd插点))