int SeqEdgeColoringPar<DefaultStructs>::greedyInter(const Graph &graph, ColorMap &colors, EInIter beg, EInIter end, int maxCol) { if (DefaultStructs::ReserveOutAssocCont) colors.reserve(graph.getEdgeNo(EdDirIn|EdDirOut|EdUndir)); int locMax = -1; while(beg != end) { int col = greedyInter(graph, colors, *beg++, maxCol); if(col > maxCol) maxCol = col; if(col > locMax) locMax = col; } return locMax; }
int SeqEdgeColoringPar<DefaultStructs>::greedy(const Graph &graph, ColorMap &colors) { colors.reserve(graph.getEdgeNo(EdDirIn|EdDirOut|EdUndir)); const EdgeDirection Mask = EdDirIn|EdDirOut|EdUndir; int locMax = -1; for(typename Graph::PEdge ee = graph.getEdge(Mask); ee; ee = graph.getEdgeNext(ee, Mask)) { int col = greedy(graph, colors, ee); if(col > locMax) locMax = col; } return locMax; }
int SeqEdgeColoringPar<DefaultStructs>::vizing(const Graph &graph, ColorMap &colors) { typedef typename Graph::PVertex Vert; typedef typename Graph::PEdge Edge; const EdgeDirection Mask = EdDirIn|EdDirOut|EdUndir; colors.reserve(graph.getEdgeNo(EdDirIn|EdDirOut|EdUndir)); int degree = graph.Delta(Mask); int mu = makeSubgraph(graph, std::make_pair(stdChoose(true), !edgeTypeChoose(Loop))).mu(); VizingState<Graph, ColorMap> vState(graph, colors, degree+mu); if(degree-1>vState.maxColor) vState.maxColor = degree-1; //edge coloring int idFree; while( (idFree=vState.colorToList[vState.notColored])>0 ) { Edge ee = vState.listEdgeCol[idFree].edge; vizing(vState, ee, ee->getEnd1()); } return vState.maxColor; }
int SeqEdgeColoringPar<DefaultStructs>::vizingSimple(const Graph &graph, ColorMap &colors) { typedef typename Graph::PVertex Vert; typedef typename Graph::PEdge Edge; const EdgeDirection Mask = EdDirIn|EdDirOut|EdUndir; colors.reserve(graph.getEdgeNo(EdDirIn|EdDirOut|EdUndir)); int degree = graph.Delta(Mask); VizingState<Graph, ColorMap> vState(graph, colors, degree+1); int LOCALARRAY(tmpTab, vState.notColored); //tmpTab - is used for checking free color availability if(colors.size()>0) { //for each vertex checks the free color availability (freeColor) for(Vert vv = graph.getVert(); vv; vv = graph.getVertNext(vv)) { for(int i=0; i<vState.notColored; i++) tmpTab[i] = 0; for(Edge ee=graph.getEdge(vv, Mask); ee; ee = graph.getEdgeNext(vv, ee, Mask)) { if(!colors.hasKey(ee)) continue; int tmpCol = colors[ee]; if(tmpCol<0 || tmpCol>=vState.notColored) continue; tmpTab[ tmpCol ] = 1; } int i=0; while(i<vState.notColored && tmpTab[i]==1) i++; vState.tabVert[ vState.vertToTab[vv] ].freeColor = i; } } //init edges by degree colors int ii; for(Edge edge = graph.getEdge(Mask); edge; edge = graph.getEdgeNext(edge, Mask)) { if(colors.hasKey(edge)&&colors[edge]>=0) continue; Vert vert1 = graph.getEdgeEnd1(edge); Vert vert2 = graph.getEdgeEnd2(edge); for(int i=0; i<degree; i++) tmpTab[i] = 0; for(Edge ee = graph.getEdge(vert1, Mask); ee; ee = graph.getEdgeNext(vert1, ee, Mask)) { if(!colors.hasKey(ee)) continue; int tmpCol = colors[ee]; if(tmpCol<0 || tmpCol>=vState.notColored) continue; tmpTab[ tmpCol ] = 1; } for(Edge ee=graph.getEdge(vert2, Mask); ee; ee=graph.getEdgeNext(vert2, ee, Mask)) { if(!colors.hasKey(ee)) continue; int tmpCol = colors[ee]; if(tmpCol<0 || tmpCol>=vState.notColored) continue; tmpTab[ tmpCol ] |= 2; } for(int i=0; i<degree; i++) { if(tmpTab[i]!=0) continue; colors[edge] = i; vState.changeColor(edge, vState.notColored, i); tmpTab[i] = 3; // 3=1|2 if(i > vState.maxColor) vState.maxColor = i; break; } //setting free colors at vertices for(ii=0; ii<degree; ii++) if((tmpTab[ii]&1)==0) break; int id = vState.vertToTab[vert1]; vState.tabVert[id].freeColor = ii; for(ii=0; ii<degree; ii++) if((tmpTab[ii]&2)==0) break; id = vState.vertToTab[vert2]; vState.tabVert[id].freeColor = ii; } //edge coloring int idFree; while( (idFree=vState.colorToList[vState.notColored])>0 ) { Edge ee = vState.listEdgeCol[idFree].edge; vizingSimple(vState, ee, ee->getEnd1()); } return vState.maxColor; }