題意:
根據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;
}