void bellmann_ford_extended(vvii &e, int source, vi &dist, vb &cyc) {
	dist.assign(e.size(), INF);
	cyc.assign(e.size(), false); // true when u is in a <0 cycle
	dist[source] = 0;
	for (int iter = 0; iter < e.size() - 1; ++iter){
		bool relax = false;
		for (int u = 0; u < e.size(); ++u)
			if (dist[u] == INF) continue;
			else for (auto &e : e[u])
				if(dist[u]+e.second < dist[e.first])
					dist[e.first] = dist[u]+e.second, relax = true;
		if(!relax) break;
	}
	bool ch = true;
	while (ch) {				// keep going untill no more changes
		ch = false;				// set dist to -INF when in cycle
		for (int u = 0; u < e.size(); ++u)
			if (dist[u] == INF) continue;
			else for (auto &e : e[u])
				if (dist[e.first] > dist[u] + e.second
					&& !cyc[e.first]) {
					dist[e.first] = -INF;
					ch = true;		//return true for cycle detection only
					cyc[e.first] = true;
				}
	}
}
void dijkstra_multiple_paths(vvii& g, int src, vi& dist, vvi& pred) {
    // initialize
    dist.assign(g.size(), numeric_limits<int>::max());
    dist[src] = 0;
    pred.assign(g.size(), vector<int>());
    set<ii> set = { { 0, src } };

    while (!set.empty()) {
        // extract min
        int u = set.begin()->second;
        set.erase(set.begin());

        for (auto& e : g[u]) {
            int v = e.first;
            int w = e.second;
            if (dist[u] + w < dist[v]) {
                // relax / decrease key
                set.erase({ dist[v], v });
                dist[v] = dist[u] + w;
                pred[v] = { u };
                set.insert({ dist[v], v });
            } else if(dist[u] + w == dist[v]) {
                pred[v].push_back(u);
            }
        }
    }
}
int longest_increasing_subsequence(vvii &boxes, vi &lis, vi &dad) {
	for (int i = 0; i < boxes.size(); i++) {
		lis.push_back(1);
		dad.push_back(i);
	}

	int idx = 0;

	for (int i = 0; i < boxes.size(); i++) {
		for (int j = i - 1; j >= 0; j--) {
			if (nests(boxes[i].first, boxes[j].first) and lis[i] < lis[j] + 1) {
				lis[i] = lis[j] + 1;
				dad[i] = j;
				if (lis[i] > lis[idx]) idx = i;
			}
		}
	}

	return idx;
}
Example #4
0
void showGraph(vvii G){
	int n=G.size();
	for(int i=0; i<n; i++){
		int t=G[i].size();
		printf("<%d>:",i);	
		for(int j=0; j<t; j++){
			printf("Vertex:%d, Weight:%d",G[i][j].first,G[i][j].second);
		}
		printf("\n");
		}	
}
void dijkstra(vvii &E, vi &dist, int s) {
	int N = E.size();
	dist.assign(N, LLINF);
	priority_queue<ii, vector<ii>, greater<ii>> pq;
	dist[s] = 0LL;
	pq.push({0LL, s});
	
	while (!pq.empty()) {
		ll d = pq.top().first;
		int u = pq.top().second;
		pq.pop();
		
		if (d != dist[u]) continue;
		for (ii vw : E[u]) {
			int v = vw.first;
			ll w = vw.second;
			if (dist[v] > w + d) {
				dist[v] = w + d;
				pq.push({dist[v], v});
			}
		}
	}
}