floyd求最小环
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]=g[j][i]=dis[i][j]=dis[j][i]=inf; for(int i=1;i<=m;i++){ int u,v,w;scanf("%d%d%d",&u,&v,&w); g[u][v]=g[v][u]=dis[u][v]=dis[v][u]=min(w,g[u][v]); }//读入边 void floyd{ int mi=inf; for(int k=1;k<=n;k++){ for(int i=1;i<k;i++) for(int j=i+1;j<k;j++) mi=min(mi,dis[i][j]+g[i][k]+g[k][j]);
//在每次k未更新时寻找钦定k在环中的最小环for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); //k的更新
}
if(mi==inf) puts("Impossible");
else printf("%d\n",mi); }
先钦定此点一定在环中并且不更新,更新答案后再更新k点