CSES - Aalto Competitive Programming 2024 - wk2 - Mon - Results
Submission details
Task:Building Teams
Sender:odanobunaga8199
Submission time:2024-09-09 16:40:21 +0300
Language:C++ (C++20)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.00 sdetails
#2ACCEPTED0.00 sdetails
#3ACCEPTED0.00 sdetails
#4ACCEPTED0.00 sdetails
#5ACCEPTED0.00 sdetails
#6ACCEPTED0.29 sdetails
#7ACCEPTED0.29 sdetails
#8ACCEPTED0.29 sdetails
#9ACCEPTED0.29 sdetails
#10ACCEPTED0.20 sdetails
#11ACCEPTED0.00 sdetails
#12ACCEPTED0.00 sdetails

Compiler report

input/code.cpp: In function 'bool bipartite(std::vector<std::vector<int> >&, int, int, std::vector<bool>&)':
input/code.cpp:34:49: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |                 for (int i = 0; i
      |                                 ~                
   34 |                                                 < edges[current].size();
      |                                                 ^~~~~~~~~~~~~~~~~~~~~~~

Code

#include <bits/stdc++.h>
using namespace std;

unordered_set<int> sets[2];

bool bipartite(vector<vector<int> >& edges,
			int V, int i,
			vector<bool>& visited)
{
	if (V == 0) {
		return true;
	}
	vector<int> pending;

	sets[0].insert(i);

	pending.push_back(i);
	while (pending.size() > 0) {

		int current = pending.back();

		// Mark the current vertex true
		visited[current] = true;
		pending.pop_back();

		// Finding the set of
		// current vertex(parent vertex)
		int currentSet
			= sets[0].count(current)
					> 0
				? 0
				: 1;
		for (int i = 0; i
						< edges[current].size();
			i++) {

			// Picking out neighbour
			// of current vertex
			int neighbor = edges[current][i];

			// If not present
			// in any of the set
			if (sets[0].count(neighbor) == 0
				&& sets[1].count(neighbor) == 0) {

				// Inserting in opposite
				// of current vertex
				sets[1 - currentSet].insert(neighbor);
				pending.push_back(neighbor);
			}

			// Else if present in the same
			// current vertex set the partition
			// is not possible
			else if (sets[currentSet].count(neighbor)
					> 0) {
				return false;
			}
		}
	}

	return true;
}

bool possibleBipartition(int V,
						vector<vector<int> >& G)
{

	// To store graph as adjacency list in edges
	vector<vector<int> > edges(V + 1);
	for (auto v : G) {
		edges[v[0]].push_back(v[1]);
		edges[v[1]].push_back(v[0]);
	}

	vector<bool> visited(V + 1, false);
	bool res = true;
	for (int i = 1; i <= V; i++) {
		if (!visited[i]) {
			res = res and bipartite(edges, V,
									i, visited);
		}
	}
	return res;
}

int main()
{
	int V, E;
	cin >> V >> E;
	vector<vector<int>> G(E);
	
    for (int i = 0; i < E; i++) {
        int n, m;
        cin >> n >> m;
        G[i].push_back(n);
        G[i].push_back(m);
    }
	// If partition is possible
	if (possibleBipartition(V, G)) {
		//for (auto elem : sets[0]) {
		//	cout << elem << " ";
		//}
		//cout << "\n";
		//for (auto elem : sets[1]) {
		//	cout << elem << " ";
		//}
		for (int i = 1; i<=V; i++){
		    if(sets[0].contains(i)){
		        cout << "1 ";
		    }
		    else {
		        cout << "2 ";
		    }
		}
	}

	// If partition is not possible
	else
		cout << "IMPOSSIBLE";

	return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
10 20
3 4
8 10
3 7
1 8
...

correct output
1 1 1 2 2 1 2 2 2 1 

user output
1 1 1 2 2 1 2 2 2 1 

Test 2

Verdict: ACCEPTED

input
10 20
1 3
8 10
2 4
6 8
...

correct output
1 1 2 2 1 1 1 2 1 1 

user output
1 1 2 2 1 1 1 2 1 1 

Test 3

Verdict: ACCEPTED

input
10 20
7 10
3 10
9 10
2 10
...

correct output
1 2 2 1 1 1 2 1 2 1 

user output
1 2 2 1 1 1 2 1 2 1 

Test 4

Verdict: ACCEPTED

input
10 20
2 4
2 10
7 10
4 6
...

correct output
1 2 1 1 2 2 2 1 2 1 

user output
1 2 1 1 2 2 2 1 2 1 

Test 5

Verdict: ACCEPTED

input
10 20
3 5
8 10
9 10
1 8
...

correct output
IMPOSSIBLE

user output
IMPOSSIBLE

Test 6

Verdict: ACCEPTED

input
100000 200000
47355 96505
90709 92058
735 80715
91802 94265
...

correct output
1 2 2 1 2 1 1 1 2 2 1 2 1 1 1 ...

user output
1 2 2 1 2 1 1 1 2 2 1 2 1 1 1 ...
Truncated

Test 7

Verdict: ACCEPTED

input
100000 200000
59991 95794
95150 96051
78453 94730
90411 95523
...

correct output
1 1 1 2 2 1 1 2 1 2 1 2 2 2 1 ...

user output
1 1 1 2 2 1 1 2 1 2 1 2 2 2 1 ...
Truncated

Test 8

Verdict: ACCEPTED

input
100000 200000
89827 96402
65137 86792
80965 94708
19479 48078
...

correct output
1 2 1 1 2 1 2 2 2 1 2 1 1 2 1 ...

user output
1 2 1 1 2 1 2 2 2 1 2 1 1 2 1 ...
Truncated

Test 9

Verdict: ACCEPTED

input
100000 200000
72952 83723
66197 70052
2949 52160
55753 95651
...

correct output
1 1 2 2 2 1 1 2 2 2 2 2 1 2 1 ...

user output
1 1 2 2 2 1 1 2 2 2 2 2 1 2 1 ...
Truncated

Test 10

Verdict: ACCEPTED

input
100000 200000
38942 96755
70049 82663
7746 72732
87819 99029
...

correct output
IMPOSSIBLE

user output
IMPOSSIBLE

Test 11

Verdict: ACCEPTED

input
5 4
1 2
3 4
4 5
5 3

correct output
IMPOSSIBLE

user output
IMPOSSIBLE

Test 12

Verdict: ACCEPTED

input
4 5
1 2
1 4
2 3
2 4
...

correct output
IMPOSSIBLE

user output
IMPOSSIBLE