1. 程式人生 > >無向圖有向圖最小環

無向圖有向圖最小環

floyd求。

for(int k=1;k<=n;k++)
{
 for(int i=1;i<k;i++)
  for(int j=1;j<k;j++)
   ans=min(ans,dis[i][k]+dis[k][j]+map1[j][i])
 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為最小環中最大的節點,所以i j只需要列舉到k-1,後面的都是冗餘的。有向圖注意標號,無向圖無所謂。

重點在於k是最大標號,先求最小環,再鬆弛,否則k可能成為中間節點

比如

3一定要先更新最小環,再被鬆弛。

最小環中的路徑在 更新的時候一定要保證路徑上的點的標號嚴格小於k,其實是不等於k

有向圖也可以先求floyd最短路。

然後列舉邊u v  ans=min(ans,map1[u][v]+dis[v][u])