直接一遍floyd;然后求自己到自己的最短距离,注意初始化问题
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define mmin(a,b) a<b? a:b
using namespace std;
const int INF=0x7ffffff;
int mp[105][105];
int n,m;
int floyd()
{
int i,j,k;
for(k=0; k<n; k++)
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(mp[i][j] > mp[i][k]+mp[k][j])
mp[i][j]=mp[i][k]+mp[k][j];
}
int main()
{
// printf("%d\n",INF);
int cases;
scanf("%d",&cases);
while(cases--)
{
int a,b,c;
scanf("%d %d",&n,&m);
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
mp[i][j]=INF;
for(int i=0; i<m; i++)
{
scanf("%d %d %d",&a,&b,&c);
if(c<mp[a][b])
mp[a][b]=c;
}
floyd();
int result=INF;
/* for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
printf("%d ",mp[i][j]);
printf("\n");
}*/
for(int i=0; i<n; i++)
{
// printf("%d\n",mp[i][i]);
if(result>mp[i][i])
result=mp[i][i];
}
if(result == INF)
printf("-1\n");
else
printf("%d\n",result);
}
return 0;
}