description:
小 G是 GT国的国王,他的首都是一张 n个点的完全无向图,其中点 i和点 j之间的无向边长度为 Dis[i][j],恰好点 i和点 j之间的最短路长度也是 Dis[i][j]。
小 G想知道,最少保留多少条道路,可以使点 i和点 j的最短路长度还是 Dis[i][j]。
1≤Dis[i][j]≤109
| n≤ | |
|---|---|
| 20% | 5 | 
| 40% | 10 | 
| 60% | 20 | 
| 80% | 50 | 
| 100% | 300 | 
solution:
- 20%
n<=5边数m=n∗(n−1)/2=10
210枚举哪⼀一些边被选了了,⽤用floyd验算
- 100%
O(n3)枚举i,j,k⼀一开始有n2条边,对于所有i,j,如果存在k使得dis[i][k]+dis[k][j]=dis[i][j],则i,j之间的边可以删去
code:
#include<cstdio>
using namespace std;
int a[305][305];
int main()
{
	freopen("road.in","r",stdin);
	freopen("road.out","w",stdout); 
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			for(int k=1;k<=n;k++)
			{
				if(a[i][j]==a[i][k]+a[k][j]&&i!=k&&j!=k)
				{
					ans++;
					break;
				}
			}
		}
	}
	printf("%d\n",n*(n-1)/2-ans);
	return 0;
} 



 京公网安备 11010502036488号
京公网安备 11010502036488号