Skip to content
Programmingoneonone
Programmingoneonone

Learn everything about programming

  • Home
  • CS Subjects
    • Internet of Things (IoT)
    • Digital Communication
    • Human Values
    • Cybersecurity
  • Programming Tutorials
    • C Programming
    • Data structures and Algorithms
    • 100+ Java Programs
    • 100+ C Programs
  • HackerRank Solutions
    • HackerRank Algorithms Solutions
    • HackerRank C problems solutions
    • HackerRank C++ problems solutions
    • HackerRank Java problems solutions
    • HackerRank Python problems solutions
Programmingoneonone
Programmingoneonone

Learn everything about programming

HackerEarth Black and White problem solution

YASH PAL, 31 July 2024
In this HackerEarth Black and White problem solution, You are given a graph G consisting of N nodes and M edges. Each node of G is either colored in black or white. Also, each edge has a particular weight. Now, you need to find the least expensive path between node 1 and node N, such that the difference of the number of black nodes and white nodes on the path is no more than.
It is guaranteed G does not consist of multiple edges and self-loops.
HackerEarth Black and White problem solution

HackerEarth Black and White problem solution.

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define zero 1001
#define black 0
#define white 1
#define ini(a) memset(a,-1,sizeof(a))
vector<pair<int,int> > g[1005];
int control[1005];
int dp[1005][2005];
int dijkstra(int source,int n){
ini(dp);
set<pair<int,pair<int,int> > > s;
int index=(control[source]==black)?(zero-1):(zero+1);
dp[source][index]=0;
s.insert(mp(0,mp(source,index)));
while(!s.empty()){
int u=s.begin()->Y.X;
int dif=s.begin()->Y.Y;
s.erase(s.begin());
for(int i=0;i<g[u].size();i++){
int v=g[u][i].X;
int w=g[u][i].Y;
int ind=(control[v]==black)?(dif-1):(dif+1);
if(dp[v][ind]==-1||dp[v][ind]>dp[u][dif]+w){
s.erase(mp(dp[v][ind],mp(v,ind)));
dp[v][ind]=dp[u][dif]+w;
s.insert(mp(dp[v][ind],mp(v,ind)));
}
}
}
int ans=INT_MAX;
for(int i=-1;i<=1;i++){
if(dp[n][zero+i]!=-1)
ans=min(ans,dp[n][zero+i]);
}
return ans;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int u,v,l;
scanf("%d%d%d",&u,&v,&l);
g[u].pb(mp(v,l));
}
for(int i=1;i<=n;i++){
scanf("%d",&control[i]);
}
int ans=dijkstra(1,n);
if(ans==INT_MAX)
ans=-1;
printf("%dn",ans);

}

Second solution

import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.io.BufferedInputStream;
import java.util.PriorityQueue;
import java.util.ArrayList;
import java.util.AbstractCollection;
import java.io.FilterInputStream;
import java.io.InputStream;

public class Main {
public static void main(String[] args) {
new Thread(null, new Runnable() {
public void run() {
new Main().solve();
}
}, "1", 1 << 26).start();
}

void solve() {
InputStream inputStream = System.in;
OutputStream outputStream = System.out;
ScanReader in = new ScanReader(inputStream);
PrintWriter out = new PrintWriter(outputStream);
BlackandWhite solver = new BlackandWhite();
solver.solve(1, in, out);
out.close();
}

static class BlackandWhite {
ArrayList<pair>[] arrayLists;
int[][] dp;
int[] type;
int ze = 1005;

private int dfs(int start, int n) {
PriorityQueue<pair> priorityQueue = new PriorityQueue<>();
priorityQueue.add(new pair(start, 0, type[start] == 0 ? ze - 1 : ze + 1));
while (!priorityQueue.isEmpty()) {
pair tt = priorityQueue.poll();
if (dp[tt.node][tt.diff] != 1000000000) continue;
dp[tt.node][tt.diff] = tt.weight;
for (int i = 0; i < arrayLists[tt.node].size(); i++) {
if (dp[arrayLists[tt.node].get(i).node][(type[arrayLists[tt.node].get(i).node] == 0 ? tt.diff - 1 : tt.diff + 1)] == 1000000000) {
priorityQueue.add(new pair(arrayLists[tt.node].get(i).node, tt.weight + arrayLists[tt.node].get(i).weight, (type[arrayLists[tt.node].get(i).node] == 0 ? tt.diff - 1 : tt.diff + 1)));
}
}
}
return Math.min(dp[n][ze], Math.min(dp[n][ze - 1], dp[n][ze + 1]));

}

public void solve(int testNumber, ScanReader in, PrintWriter out) {
int n = in.scanInt();
int m = in.scanInt();
if (n < 1 || n > 1000) throw new RuntimeException();
if (m < 1 || m > 10000) throw new RuntimeException();
arrayLists = new ArrayList[n + 1];
dp = new int[n + 1][2 * (1005)];
for (int i = 0; i <= n; i++) Arrays.fill(dp[i], 1000000000);
for (int i = 0; i <= n; i++) arrayLists[i] = new ArrayList<>();
for (int i = 0; i < m; i++) {
int u = in.scanInt();
int v = in.scanInt();
int l = in.scanInt();
if (l < 1 || l > 1000) throw new RuntimeException();
arrayLists[u].add(new pair(v, l));
}
type = new int[n + 1];
for (int i = 1; i <= n; i++) type[i] = in.scanInt();
int ans = dfs(1, n);
if (ans == 1000000000) out.println(-1);
else out.println(ans);

}

class pair implements Comparable<pair> {
int node;
int weight;
int diff;


public int compareTo(pair o) {
return this.weight - o.weight;
}

public pair(int node, int weight, int diff) {
this.node = node;
this.weight = weight;
this.diff = diff;
}

public pair(int node, int weight) {
this.node = node;
this.weight = weight;
}

}

}

static class ScanReader {
private byte[] buf = new byte[4 * 1024];
private int index;
private BufferedInputStream in;
private int total;

public ScanReader(InputStream inputStream) {
in = new BufferedInputStream(inputStream);
}

private int scan() {
if (index >= total) {
index = 0;
try {
total = in.read(buf);
} catch (Exception e) {
e.printStackTrace();
}
if (total <= 0) return -1;
}
return buf[index++];
}

public int scanInt() {
int integer = 0;
int n = scan();
while (isWhiteSpace(n)) n = scan();
int neg = 1;
if (n == '-') {
neg = -1;
n = scan();
}
while (!isWhiteSpace(n)) {
if (n >= '0' && n <= '9') {
integer *= 10;
integer += n - '0';
n = scan();
}
}
return neg * integer;
}

private boolean isWhiteSpace(int n) {
if (n == ' ' || n == 'n' || n == 'r' || n == 't' || n == -1) return true;
else return false;
}

}
}
coding problems solutions

Post navigation

Previous post
Next post

Pages

  • About US
  • Contact US
  • Privacy Policy

Follow US

  • YouTube
  • LinkedIn
  • Facebook
  • Pinterest
  • Instagram
©2025 Programmingoneonone | WordPress Theme by SuperbThemes