luogu CF25C Roads in Berland |最短路floyd

题意翻译

有一个国家,有(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));
	}
}
原文地址:https://www.cnblogs.com/naruto-mzx/p/12691145.html