CF25C
题目描述
题解
本题让我对Floyd有了新的理解
众所周知,Floyd算法用于解决多源最短路问题
O
(
n
3
)
O(n^3)
O(n3)。
其做法为:首先枚举中间点,然后枚举另外两个点,更新答案。
然后对于该题来说,每次新加入一条边
(
u
−
>
v
)
(u->v)
(u−>v),其实真正影响的最短路只有经过
u
,
v
u,v
u,v的最短路径,那么我们只需要枚举另外两个节点,然后更新答案即可(因为中间点已经确定为
u
,
v
u,v
u,v)
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){
int f=1,re=0;
char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-'){f=-1,ch=getchar();}
for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
return re*f;
}
int d[509][509],n,k;
signed main(){
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=read();
k=read();
for(int cas=1;cas<=k;cas++){
int x=read(),y=read(),z=read();
if(d[x][y]>z){
d[x][y]=d[y][x]=z;
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][x]+d[x][j]);
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][y]+d[y][j]);
}int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans+=d[i][j];
printf("%lld ",ans/2);
}return 0;
}