//usage: ./CutEdgesHigh #include #include #include int n, m; int* edges; int* G; int* firstOut; void create_adj(); void find_cut_edges(); int* cut_edges; int n_cut_edges; int n_cut_pairs; int* dfs, * idfs, * p; int* high; void compute_high(); int* ufparent, * ufrank, * representative; void ufInit(); int find(int); void unite(int, int, int); int main(int n_args, char** args){ FILE* fp = fopen(args[1], "r"); fscanf(fp, "%d %d", &n, &m); edges = (int*)malloc(sizeof(int)*2*m); for(int i=0;i0;i--){ int v=idfs[i]; if(l[v]!=v){ M[v]=v;continue; } if(L[v]!=R[v]){ M[v]=v;continue; } int c=L[v]; int m=M[c]; while(1){ if(dfs[l[m]]=i){ L[m]=nextSibling[L[m]]; } while(dfs[low[R[m]]]>=i){ R[m]=prevSibling[R[m]]; } if(L[m]!=R[m]){ M[v]=m;break; } c=L[m]; m=M[c]; } nextM[c]=v; } char* tree_edge_is_cut_edge = (char*)malloc(sizeof(char)*n); char* back_edge_is_cut_edge = (char*)malloc(sizeof(char)*n); for(int i=0;i=0;i--){ int v=idfs[i]; for(int j=firstOut[v];j0){ ufparent[r2]=r1; representative[r1]=w; } else{ ufparent[r1]=r2; ufrank[r2]++; representative[r2]=w; } } void create_adj(){ G = (int*)malloc(sizeof(int)*4*m); firstOut = (int*)malloc(sizeof(int)*(n+1)); for(int i=0;i<=n;i++){ firstOut[i]=0; } for(int i=0;i