AtCoder Beginner Contest 074(CD)
C - Sugar Water
思路:暴力。
D - Restoring Road Network
思路:类似 f l o y d , floyd, floyd,考虑对任意两个点 u , v u,v u,v
是否存在 d [ u ] [ v ] = d [ u ] [ w ] + d [ w ] [ v ] d[u][v]=d[u][w]+d[w][v] d[u][v]=d[u][w]+d[w][v]
若存在说明 d [ u ] [ v ] d[u][v] d[u][v]这条边可以不需要。
若 d [ u ] [ v ] > d [ u ] [ w ] + d [ w ] [ v ] d[u][v]>d[u][w]+d[w][v] d[u][v]>d[u][w]+d[w][v]说明不满足条件直接返回 − 1 -1 −1。
然后对所有需要的边求和即可。
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(k!=i&&k!=j&&i!=j){
if(a[i][j]==a[i][k]+a[k][j]) b[i][j]=1;
else if(a[i][j]>a[i][k]+a[k][j]) return puts("-1"),0;
}
ll ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
if(!b[i][j]) ans+=a[i][j];
printf("%lld\n",ans);