luogu CF25C Roads in Berland |最短路floyd
题意翻译
有一个国家,有\(n\) 个城市,编号为 \(1\) ~\(n\) ,任意两个城市之间要么没有道路,要么有一条双向的道路连接。每一条道路都有一个长度——长度是一个为\(1\) ~\(1000\) 之间的整数。
现在我们知道了任意两个城市之间的最短路径,但这可能有点长。现在国家决定再次建造kkk 条道路(也是双向的),但国家想知道在新增一条道路后所有最短路径的总长度,但缺少人手。于是,在这个时刻,国家想到了擅长OI的你,请你帮助他们完成这个任务。
输入输出格式
输入格式
第一行,一个正整数\(n(2<=n<=300)\) ——这个国家内城市的个数。
接下来有一个\(n\times 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\neq 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));
}
}
不以物喜,不以己悲