[板子]floyd求最小环
要长看.
1 //floyd求无向图最小环+环上的点 2 int pre[N][N],dis[N][N],graph[N][N]; 3 void init(){ 4 for(int i=1;i<=n;++i){ 5 for(int j=1;j<=n;++j){ 6 pre[i][j]=i; 7 graph[i][j]=dis[i][j]=Inf; 8 } 9 graph[i][i]=dis[i][i]=0; 10 } 11 //建边 12 } 13 void floyd(){ 14 int min_huan=Inf; 15 for(int k=1;k<=n;++k){ 16 for(int i=1;i<k;++i)//不能超过k 17 for(int j=i+1;j<=k;++j){ 18 if(min_huan>dis[i][j]+graph[j][k]+graph[k][i]){//多一个graph数组的作用在于此,在松弛的过程中,会破坏掉两点之间是否真的存在边的表示,所有需要多开一个graph 19 min_huan=dis[i][j]+graph[j][k]+graph[k][i]; 20 path[0]=0;sum=1;//sum为最小环的个数 21 int u=i;//从i开始一个一个搞 22 while(u!=j){ 23 path[++path[0]]=u; 24 u=pre[u][j];//原文写的是pre[j][u]??,好像都行 25 } 26 path[++path[0]]=j; 27 path[++path[0]]=k; 28 } 29 else if(min_huan==dis[i][j]+graph[j][k]+graph[k][i]) sum++; 30 } 31 } 32 }
Keep it simple and stupid.