exmaple:
5
12 34 10 7 8
3
1 2
2 3
3 1
Output:
56
- Groups are formed as: [1,2,3][4][5].
- Maximum collection is 56 (collected by volunteer 1, 2, and 3).
My logic was to run a dfs and store the maximum value among all components in graph as my ans,
Here is my code:
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int dfs(int v, int values[], unordered_map<int, vector<int>> adj, int visited[])
{
int ans = 0;
if (visited[v] == 0)
{
visited[v] = 1;
for (auto j : adj[v])
{
if (visited[j] == 0)
{
ans = ans + dfs(j, values, adj, visited);
}
}
return ans + values[v];
}
return 0;
}
void solve()
{
int n;
cin >> n;
int v[n];
int visited[n];
for (int i = 0; i < n; i++)
{
visited[i] = 0;
}
//vector<vector<int>> adj(n);
unordered_map<int, vector<int>> adj;
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
int p;
int ans = 0;
cin >> p;
while (p--)
{
int f, s;
cin >> f >> s;
f = f - 1;
s = s - 1;
adj[f].push_back(s);
adj[s].push_back(f);
}
for (int i = 0; i < n; i++)
{
if (visited[i] == 0)
{
int val = dfs(i, v, adj, visited);
if (val > ans)
{
ans = val;
}
}
}
// for (int i = 0; i < n; i++)
// {
// cout << i << " ";
// for (auto j : adj[i])
// {
// cout << j << " ";
// }
// cout << endl;
// }
cout << ans << endl;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
// #ifndef ONLINE_JUDGE
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
// #endif // ONLINE_JUDGE
int t = 1;
//cin >> t;
while (t--)
{
solve();
}
}
However my solution was giving a memory limited exceeded
error.
Then I tried with union-find
data structure, but it was giving wrong answer
. Here is my code:
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
vector<int> parent;
vector<int> values;
vector<int> r;
int find(int s)
{
if (parent[s] == s)
{
return s;
}
return parent[s] = find(parent[s]);
}
void unite(int a, int b)
{
a = find(a);
b = find(b);
if (a != b)
{
if (r[a] < r[b])
{
parent[a] = parent[b];
r[b] = r[b] + r[a];
}
else
{
parent[b] = parent[a];
r[a] = r[a] + r[b];
}
}
}
void solve()
{
int n;
cin >> n;
parent.resize(n);
values.resize(n);
r.resize(n);
int ans = 0;
for (int i = 0; i < n; i++)
{
parent[i] = i;
}
for (int i = 0; i < n; i++)
{
cin >> values[i];
}
for (int i = 0; i < n; i++)
{
r[i] = 1;
}
int p;
cin >> p;
unordered_map<int, int> m;
while (p--)
{
int f, s;
cin >> f >> s;
f = f - 1;
s = s - 1;
int f1 = find(f);
int f2 = find(s);
if (f1 != f2)
{
unite(f1, f2);
}
}
for (int i = 0; i < n; i++)
{
if (m[parent[i]])
{
m[parent[i]] = m[parent[i]] + values[i];
ans = max(ans, m[parent[i]]);
}
else
{
m[parent[i]] = values[i];
ans = max(ans, m[parent[i]]);
}
}
cout << ans << endl;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif // ONLINE_JUDGE
solve();
}
Can someone guide me where I am wrong?