std::vector<double> spGraph::sssp ( int node ){ std::vector<double> paths(this->nodeMatrix.size()); std::vector<int> connections, unvisited(this->nodeMatrix.size()); int i, cur_node; for ( i = 0; i < paths.size(); i++ ){ paths[i] = DBL_MAX; unvisited[i] = 1; } paths[node] = 0; cur_node = node; while ( !all0(unvisited) ){ connections = this->getConnections(cur_node); for ( i = 0; i < connections.size(); i++ ){ if ( unvisited[connections[i]] ){ paths[connections[i]] = min(this->getEdge( cur_node, connections[i] ) + paths[cur_node], paths[connections[i]]); } } unvisited[cur_node] = 0; cur_node = this->minUnvisited( paths, unvisited ); } return paths; }
int bftraversal(struct graph *g) { int i; struct enode *e; struct vnode *v; int ndx; int level; if( (f = init_fifo(g->sz)) == NULL) { perror("bfttraversal: fifo Malloc error"); return(-1); } //Reset all visited fields to 0 for( i = 0; i < g->sz; i++) g->vn[i].visited = 0; i = 0; printf("\n"); while(i != -1) { g->vn[i].visited = 1; level = 1; insert_fifo(i,&f); while(f->sz > 0) { extract_fifo(&ndx,f); v = &(g->vn[ndx]); printf("%d(%d) ", v->item, v->visited); level = v->visited + 1; e = v->edge; while( e != NULL) { if( !g->vn[e->vndx].visited) { g->vn[e->vndx].visited = level; insert_fifo(e->vndx,&f); } e = e->next; } } i = unvisited(g); printf("\n"); } free(f); return(0); }
void dftraversal(struct graph *g) { int i; for( i = 0; i < g->sz; i++) g->vn[i].visited = 0; i = 0; printf("\n"); while( i != -1) { printf("%d", g->vn[i].item); dft(g, &(g->vn[i]), INCR(g->vn[i].item)); i = unvisited(g); } }
void sortFree() { unsigned char adj = adjC(CT); unsigned char pFar = (indi[term[CT][0]] == adj | indi[term[CT][0]] == CT | indi[term[CT][0]] == 0); //wont work for empty node unsigned char nxTerm = 0; if (visited[CT] == 0) termPick(); counter(); pickup(0); pickup(1); if (farCount == 2) { nxTerm = indi[arm[0]]; //SchDropAtSort(nxTerm); } else if (adjCount == 1) { if (farCount == 1) { nxTerm = adj; //SchDropAtSort(nxTerm); } else //1 empty block { nxTerm = adj; } } else if (farCount == 1) { if (adjCount == 1) { nxTerm = adj; //SchDropAtSort(nxTerm); } else //1 empty block { if (visited[adj] == 0) { nxTerm = adj; //SchDropAtSort(nxTerm); } else nxTerm = indi[arm[pFar]]; } } else if (adjCount == 2) { nxTerm = adj; //SchDropAtSort(nxTerm); } else //empty term { if (visited[1] + visited[2] + visited[3] + visited[4] >= 3 && checkForCompletion() >= 6) { if (nxTerm == 0 && swap[0] == 0 && swap[1] == 0 && arm[0] == 0 && arm[1] == 0) //panic or complete while (1); } else { if (visited[adj] == 0) nxTerm = adj; else { if (arm[0] > 0) nxTerm = indi[arm[0]]; else if (arm[1] > 0) nxTerm = indi[arm[1]]; else if (swap[CT % 2]>0) nxTerm = indi[swap[CT % 2]]; else if (swap[(CT + 1) % 2] > 0) nxTerm = indi[swap[(CT + 1) % 2]]; else nxTerm = unvisited(); } } if (nxTerm == 0) { while (1); } } if (arm[0] == 0 && arm[1] == 0) { travel(nxTerm); sortFree(); } else { travel(nxTerm); sortMan(); } }
void sortMan() { unsigned char nxTerm = 0; unsigned char adj = adjC(CT); if (visited[CT] == 0) termPick(); counter(); unsigned char pSwap = ((CT == 2 || CT == 3) ? 1 : 0); unsigned char pFar = (indi[term[CT][0]] == adj | indi[term[CT][0]] == CT | indi[term[CT][0]] == 0); //wont work for empty node if (indi[swap[CT % 2]] == CT) { if (farCount == 2) { if (term[CT][0] == term[CT][1]) { nxTerm = indi[term[CT][0]]; //the common terminal pickup(0); drop(0); gotoSort(); pickupS(1); dropS(0); goBack(); pickup(1); drop(1); } else //both diff of far { nxTerm = indi[term[CT][0]]; pickup(0); drop(0); gotoSort(); pickupS(0); dropS(1); goBack(); pickup(1); drop(1); //SchPickupAtSort //CT //SchDropAtSort //far } } else if (farCount == 1) { if (adjCount == 1) { nxTerm = adj; pickup(pFar); drop(pFar); gotoSort(); pickupS(pSwap); dropS(pSwap); goBack(); pickup(!pFar); drop(!pFar); //nothing to schedule } else { //empty node //:O :O if (visited[adj] == 0 || term[adj][0] != indi[adj] || term[adj][1] != indi[adj]) nxTerm = adj; else //seq also usable for both empty { nxTerm = indi[term[CT][pFar]]; pickup(pFar); drop(pFar); gotoSort(); pickupS(pSwap); goBack(); drop(!pFar); } } } else if (adjCount == 1) { if (farCount == 1) { nxTerm = adj; pickup(pFar); drop(pFar); gotoSort(); pickupS(pSwap); dropS(pSwap); goBack(); pickup(!pFar); drop(!pFar); //nothing to schedule } else { //empty node drop(pFar); gotoSort(); pickupS(pSwap); goBack(); pickup(!pFar); drop(!pFar); nxTerm = adj; } } else if (adjCount == 2) { nxTerm = adj; pickup(0); drop(0); gotoSort(); pickupS(pSwap); dropS(pSwap); goBack(); pickup(1); drop(1); } if (arm[0] == 0 && arm[1] == 0) { travel(nxTerm); sortFree(); } else { travel(nxTerm); sortMan(); } } else if (indi[swap[CT % 2]] != CT) //Sort can be empty { if (farCount == 2) { if (term[CT][0] == term[CT][1]) //and sort not empty why ?? :/ { nxTerm = indi[term[CT][0]]; //the common terminal //SchPickupAtSort //SchDropAtSort pickup(0); drop(0); pickup(1); drop(1); } else if (swap[CT % 2] == term[CT][0]) { pickup(0); drop(0); nxTerm = indi[arm[0]]; } else if (swap[CT % 2] == term[CT][1]) { pickup(1); drop(1); nxTerm = indi[arm[1]]; } else { if (visited[indi[term[CT][0]]] == 1) { nxTerm = indi[term[CT][0]]; } else nxTerm = indi[term[CT][1]]; pickup(0); drop(0); pickup(1); } } else if (farCount == 1) { if (adjCount == 1) { if (swap[CT % 2] == 0) { pickup(!pFar); //adjwala drop(!pFar); pickup(pFar); nxTerm = adj; //SchDropAtSort } else { //Sort of far and CT has 1 far a adj pickup(!pFar); drop(!pFar); pickup(pFar); nxTerm = adj; } } else //==== { //one node is empty if (visited[adj] == 1) nxTerm = indi[term[CT][pFar]]; else nxTerm = adj; pickup(pFar); drop(pFar); //SchDropAtSort } } else if (adjCount == 1) { if (farCount == 1) { if (swap[CT % 2] == 0) { pickup(!pFar); //adjwala drop(!pFar); pickup(pFar); nxTerm = adj; //SchDropAtSort } else { //Sort of far and CT has 1 far a adj pickup(!pFar); drop(!pFar); nxTerm = adj; } } else //1 empty 1 adj { pickup(!pFar); drop(!pFar); nxTerm = adj; } } else if (adjCount == 2) { if (swap[CT % 2] > 0) //smthin is at Sort { pickup(0); drop(0); } else { pickup(0); drop(0); pickup(1); } nxTerm = adj; } else //empty term nore precisely we arent pickiing up anything so we have NO CLUE WHERE TO GO { drop(0); drop(1); if (visited[1] + visited[2] + visited[3] + visited[4] > 3 && checkForCompletion() >= 6) { if (nxTerm == 0 && swap[0] == 0 && swap[1] == 0 && arm[0] == 0 && arm[1] == 0) //panic or complete while (1); } else { if (visited[adj] == 0) nxTerm = adj; else { if (arm[0] > 0) nxTerm = indi[arm[0]]; else if (arm[1] > 0) nxTerm = indi[arm[1]]; else if (swap[CT % 2]>0) nxTerm = indi[swap[CT % 2]]; else if (swap[(CT + 1) % 2] > 0) nxTerm = indi[swap[(CT + 1) % 2]]; else nxTerm = unvisited(); } } if (nxTerm == 0) { while (1); } } } if (arm[0] == 0 && arm[1] == 0) { travel(nxTerm); sortFree(); } else { travel(nxTerm); sortMan(); } }
void sortFree() { unsigned char adj = adjC(CT); unsigned char pFar = (indi[term[CT][0]] == adj | indi[term[CT][0]] == CT | indi[term[CT][0]] == 0); //wont work for empty node unsigned char nxTerm = 0; if (visited[CT] == 0) termPick(); counter(); pickup(0); pickup(1); if (farCount == 2) { nxTerm = indi[arm[0]]; //SchDropAtSort(nxTerm); } else if (adjCount == 1) { if (farCount == 1) { nxTerm = adj; //SchDropAtSort(nxTerm); } else //1 empty block { nxTerm = adj; } } else if (farCount == 1) { if (adjCount == 1) { nxTerm = adj; //SchDropAtSort(nxTerm); } else //1 empty block { if (visited[adj] == 0) { nxTerm = adj; //SchDropAtSort(nxTerm); } else nxTerm = indi[arm[pFar]]; } } else if (adjCount == 2) { nxTerm = adj; //SchDropAtSort(nxTerm); } else //empty term { if (visited[adj] == 0) nxTerm = adj; else nxTerm = unvisited(); if (nxTerm == 0) //panic or complete return; } if (arm[0] == 0 && arm[1] == 0) { travel(nxTerm); sortFree(); } else { travel(nxTerm); sortMan(); } }
vector<vector<int>> permute(vector<int>& nums) { deque<int> unvisited(nums.begin(), nums.end()); vector<int> path; genPerms(unvisited, path); return ret; }