zoukankan      html  css  js  c++  java
  • 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));
    	}
    }
    
  • 相关阅读:
    《C程序设计语言》练习1-10
    《C程序设计语言》练习 1-8,1-9
    被这个C程序折腾死了
    《C程序设计语言》练习 1-6,1-7
    利用圆解一元二次方程
    三角插值的 Fourier 系数推导
    利用离散 Fourier 变换解一元二次方程
    关于selenium IDE找不到元素
    【★】深入BGP原理和思想【第一部】
    【★】深入BGP原理和思想【第一部】
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/12691145.html
Copyright © 2011-2022 走看看