题意翻译
有一个国家,有(n) 个城市,编号为 (1) ~(n) ,任意两个城市之间要么没有道路,要么有一条双向的道路连接。每一条道路都有一个长度——长度是一个为(1) ~(1000) 之间的整数。
现在我们知道了任意两个城市之间的最短路径,但这可能有点长。现在国家决定再次建造kkk 条道路(也是双向的),但国家想知道在新增一条道路后所有最短路径的总长度,但缺少人手。于是,在这个时刻,国家想到了擅长OI的你,请你帮助他们完成这个任务。
输入输出格式
输入格式
第一行,一个正整数(n(2<=n<=300)) ——这个国家内城市的个数。
接下来有一个(n imes n) 的矩阵,第(i) 行,第(j) 列描述一个整数(d_{i,j}) ,描述了第(i) 个城市到第(j) 个城市的最短路径。当然(d_{i,i}=0),(d_{i,j}=d_{j,i})((1<=d_{i,j}<=1000)) 。
后面的一行有一个正整数(k(1<=k<=300)) ——准备建造的道路个数。紧跟着(k) 行,每行表示一条准备建造的道路,描述这个道路的是(a_i,b_i,c_i(1<=a_i,b_i<=n,a_i eq b_i,1<=c_i<=1000)),(a_i) 和(b_i) ,表示这是一条连接(a_i,b_i) 的道路,(c_i) 表示这一条道路的长度。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=305;
#define int long long
int n,k,dis[N][N];
signed main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&dis[i][j]);
cin>>k;
for(int u,v,w;k;k--){
scanf("%lld%lld%lld",&u,&v,&w);
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
dis[i][j]=min(dis[i][j],dis[i][u]+dis[v][j]+w);
dis[i][j]=min(dis[i][j],dis[i][v]+dis[u][j]+w);
ans+=dis[i][j];
}
printf("%lld ",(ans>>1));
}
}