hdu 6714 最短路 2

題意:

                根據floyd的算法來求使所有mp[i][j]鬆弛的最大的k的和

 

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

#include<bits/stdc++.h>
#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章