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);