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点

posted @ 2018-09-20 11:52  ASDIC减除  阅读(87)  评论(0编辑  收藏  举报