hdu 6714 最短路 2

题意:

                根据floyd的算法来求使所有mp[i][j]松弛的最大的k的和

 

思路:用Floyd算法的时候可以只算出他的下三角,然后求出ans*2即可,在计算出下三角的时候记住要mp[i][j]和mp[j][i]的值

#include
#define INF 0x3f3f3f3f3f3f3f3f
typedef long long ll;
using namespace std;
ll mp[1001][1001];
ll num[1001][1001];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int j,n,i,m;
		scanf("%d %d",&n,&m);
		ll u,v,w;
		for(i=0;i<=n;i++)
		{
			for(j=0;j<=n;j++)
			{
				if(i==j)mp[i][j]=0;
				else mp[i][j]=INF;
				num[i][j]=0;
			}
		}
		while(m--)
		{
			scanf("%lld %lld %lld",&u,&v,&w);
			mp[u][v]=mp[v][u]=min(mp[u][v],w);
		}
		int k;
		ll ans=0;
		for(k=1;k<=n;k++)
		{
			for(i=1;i<=n;i++)
			{
				if(mp[i][k]==INF)
				{
					continue;
				}
				for(j=1;j<=i;j++)
				{
				//	printf("%d %d,",i,j);
					if(mp[i][j]>mp[i][k]+mp[k][j])
					{
						ans+=k;
						ans-=num[i][j];
						mp[i][j]=mp[j][i]=mp[i][k]+mp[k][j];
						num[i][j]=num[j][i]=k;
					}
				}
				//printf("\n");

			}
		}
		printf("%lld\n",ans*2%998244353);
	}
	return 0;
}

 

你可能感兴趣的:(百度之星)