vb createStack(mvb &Map, vb Boxes, int bottom) {
	if (Map.count(bottom)!= 0 && bottom < Boxes.size()) {
		return Map[bottom];
	}
	int max_height = 0;
	vb max_stack;
	if (bottom >= Boxes.size()) {
		return max_stack;
	}
	for (int i = 0; i < Boxes.size(); ++i) {
		if (Boxes[i].canBeAbove(Boxes[bottom])) {
			vb tmpStack = createStack(Map, Boxes, i);
			int tmpHeight = stackHeight(tmpStack);
			if (tmpHeight > max_height) {
				print();
				max_stack = tmpStack;
				max_height = tmpHeight;
			}
		}
	}
	//Push Boxes[bottom] to font hee
	max_stack.push_back(Boxes[bottom]);
	
	Map[bottom] = max_stack;
	return max_stack;
}
float stackHeight(vb Boxes){
	float height = 0;
	for (int i = 0; i < Boxes.size(); ++i) {
		height += Boxes[i].getDepth();
	}
	return height;
}
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;
				}
	}
}
Beispiel #4
0
int main()
{
    FILE *in  = fopen (PROBLEM_NAME".in","r");
    FILE *out = fopen (PROBLEM_NAME".out","w");

    int k;
    fscanf(in, "%d %d ", &n, &k);
    for (int i = 0; i < n; ++i) {
        used.push_back(false);
        tin.push_back(0);
        fup.push_back(0);
        vi l;
        g.push_back(l);
    }
    for (int i = 0; i < k; ++i) {
        int x, y;
        fscanf(in, "%d %d ", &x, &y);
        g[x-1].push_back(y-1);
        g[y-1].push_back(x-1);
    }

    timer = 0;
    dfs(0);

    sort(ans.begin(), ans.end());
    ans.erase( unique( ans.begin(), ans.end() ), ans.end() );
    fprintf(out, "%d\n", (int)ans.size());
    for (size_t i = 0; i < ans.size(); ++i) {
        fprintf(out, "%d\n", ans[i]+1);
    }

    fclose(in);
    fclose(out);
    return 0;
}
bool optimal(int N, vvii &E, int &opt, vb &flip) {
	bool consistent = true;
	vi status(N, -1LL);
	vi comp(N, -1LL);
	int C = 0;
	for (int u = 0; u < N; ++u) {
		if (status[u] >= 0) continue;
		
		comp[u] = C;
		status[u] = 0LL;
		queue<int> q;
		q.push(u);
		while (!q.empty()) {
			int v = q.front();
			q.pop();
			
			for (ii wt : E[v]) {
				int w = wt.first, t = wt.second;
				if (status[w] == -1LL) {
					status[w] = (status[v] + t) % 2;
					comp[w] = C;
					q.push(w);
				} else {
					if (t == 0 && status[w] != status[v])
						consistent = false;
					if (t == 1 && status[w] == status[v])
						consistent = false;
				}
			}
		}
		++C;
	}
	
	vvi side(2, vi(C, 0LL));
	for (int u = 0; u < N; ++u) {
		side[status[u]][comp[u]]++;
	}
	
	opt = 0;
	flip.assign(N, false);
	vb comp_flip(C, false);
	for (int c = 0; c < C; ++c) {
		if (side[0][c] > side[1][c]) comp_flip[c] = true;
		opt += min(side[0][c], side[1][c]);
	}
	
	for (int u = 0; u < N; ++u) {
		if (status[u] == 0 && !comp_flip[comp[u]])
			flip[u] = true;
		if (status[u] == 1 && comp_flip[comp[u]])
			flip[u] = true;
	}
	
	return consistent;
}
	CentroidDecomposition(vvi &tree) : e(tree) {
		int V = e.size();
		tocheck.assign(V, true);
		cd.assign(V, vi());
		dir.assign(V, vi());
		p.assign(V, -1);
		size.assign(V, 0);
		
		dfs(0);
		root = decompose(0, V);
	}
Beispiel #7
0
int dijkstra(int srci,int dsti)
{
  int i,j,k,v,cost;  
  spii S;
  pii p,top;
  fill(visited.begin(),visited.begin()+n+1,false);
  fill(D.begin(),D.begin()+n+1, SENTINEL);
  
  D[srci]=0;
  S.insert(pii(0,srci));
  
  while(!S.empty()){

    top=*(S.begin());
    S.erase(S.begin());

    int d = top.first, u = top.second;
    if(u==dsti) return D[dsti];

    for(i=0;i<adjcnt[u];i++){

      v=AL[u][i].first; cost = AL[u][i].second;
      if(D[v]>D[u]+cost){

	if(D[v]!=SENTINEL)
	  S.erase(find(all(S),make_pair(D[v],v)));
	
	D[v]=D[u]+cost;
	S.insert(make_pair(D[v],v));
      }
      
    }
    
  }
  
}
Beispiel #8
0
int main()
{
    freopen("input.txt", "r", stdin);

    int n, t;
    cin >> n;
    g.assign(n, vi(0));

    // read graph
    for (int i = 0; i < n; ++i) {
        scanf("%d", &t);
        g[i].assign(t, 0);
        for (int j = 0; j < t; ++j) {
            scanf("%d", &g[i][j]);
            g[i][j]--;
        }
    }

    // partitioning    
    group.assign(n, 0);
    used.assign(n, false);
    for (int i = 0; i < n; ++i) {
        if (!used[i])
            dfs(i, 0);
    }
    
    // output
    int count = 0, gr = 0;
    for (int i = 0; i < n; ++i)
        if (group[i] == 0) count++;

    if (count > n - count) gr = 1, count = n - count;
    if (count == n - count) gr = group[0];

    printf("%d\n", count);

    for (int i = 0; i < n; ++i) {
        if (group[i] == gr) {
            printf("%d ", i + 1);
        }
    }
    printf("\n");    
    return 0;
}
Beispiel #9
0
int main()
{
    FILE *in  = fopen (PROBLEM_NAME".in","r");
    FILE *out = fopen (PROBLEM_NAME".out","w");

    fscanf(in, "%d", &n);
    for (int i = 0; i < n; ++i) {
        tin.push_back(0);
        tout.push_back(0);
        used.push_back(false);
        vi l;
        g.push_back(l);
    }

    for (int i = 0; i < n; ++i) {
        int p;
        fscanf(in, "%d", &p);
        if (p == 0) {
            root = i;
        } else {
            g[p-1].push_back(i);
        }
    }

    timer = 0;
    dfs(root);

//    print();

    int k;
    fscanf(in, "%d", &k);
    for (int i = 0; i < k; ++i) {
        int a, b;
        fscanf(in, "%d %d", &a, &b);
        int res = (upper(a-1, b-1)) ? 1 : 0;
        fprintf(out, "%d\n", res);
    }

    fclose(in);
    fclose(out);
    return 0;
}
Beispiel #10
0
int main() {

  int num = 0, cases;
  cin >> cases >> ws;

  while(num < cases) {
    int n;
    cin >> n >> ws;

    // Init
    graph.assign(n + 1, int());
    length.assign(n + 1, -1);

    // Read in edges
    int a, b;
    for (int i = 1; i <= n; ++i) {
      cin >> a >> b >> ws;
      graph[a] = b;
    }

    int max = -1, max_index = -1;
    for (int i = 1; i <= n; ++i) {
      if(length[i] == -1) {
        // Reset visited list
        visited.assign(n + 1, false);

        // Calculate path length of i & children
        length[i] = dfs(i);

        // New largest path length
        if(length[i] > max) {
          max_index = i;
          max = length[i];
        }
      }
    }

    // Print solution
    cout << "Case " << ++num << ": " << max_index << endl;
  }
  return 0;
}
Beispiel #11
0
int main()
{
    // freopen("input.txt", "r", stdin);
    int n;
    cin >> n;

    g.assign(n, vi());
    used.assign(n, false);
    values.assign(n, 0);

    int t, v;
    cin >> t;
    values[0] = t;
    for (int i = 1; i < n; ++i) {
        cin >> t >> v;
        g[t - 1].push_back(i);
        values[i] = v;
    }

    // for (size_t i = 0; i < g.size(); ++i) {
//         cout << i << "(" << values[i] << "): ";
//         for (size_t j = 0; j < g[i].size(); ++j) {
//             cout << g[i][j] << " (" << values[g[i][j]] << ") ";
//         }
//         cout << endl;
//     }
// 
//     for (size_t i = 0; i < values.size(); ++i) {
//         cout << values[i] << " ";
//     }
//     cout << endl;
    
    dfs(0);
    cout << values[0] << endl;
    return 0;
}