[板子]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 }

 

posted @ 2019-08-09 17:47  _xuefeng  阅读(19)  评论(0编辑  收藏  举报