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;
				}
	}
}
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 #4
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 #5
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 #6
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;
}