class Graph { public: int node; vector<int> adj[1001]; Graph(int n) { node = n; } void add_edge(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); } vector<int> shortest_reach(int start) { vector<int> dist (node); for(int i=0;i<node;i++) dist[i]=-1; dist[start]=0; queue<int>Q; Q.push(start); while(!Q.empty()) { int tmp = Q.front(); for(int i=0;i<adj[tmp].size();i++) if(dist[adj[tmp][i]]==-1) { dist[adj[tmp][i]] = dist[tmp]+6; Q.push(adj[tmp][i]); } Q.pop(); } return dist; } }; int main() { int queries; cin >> queries; for (int t = 0; t < queries; t++) { int n, m; cin >> n; // Create a graph of size n where each edge weight is 6: Graph graph(n); cin >> m; // read and set edges for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; u--, v--; // add each edge to the graph graph.add_edge(u, v); } int startId; cin >> startId; startId--; // Find shortest reach from node s vector<int> distances = graph.shortest_reach(startId); for (int i = 0; i < distances.size(); i++) { if (i != startId) { cout << distances[i] << " "; } } cout << endl; } return 0; }
Sunday, 23 October 2016
Shortest Reach in a Graph (CTCI)
Problem: Shortest Reach in a Graph
Connected Cell in a Grid (CTCI)
Problem: Connected Cell in a Grid
int n, m; bool vis[10][10]; void dfs(vector< vector<int> > grid, int row, int col, int *cnt) { vis[row][col]=1; *cnt = *cnt + 1; for(int i=-1;i<=1;i++) for(int j=-1;j<=1;j++) { if(!i && !j) continue; if(row+i>=0 && row+i<n && col+j>=0 && col+j<m) if(!vis[row+i][col+j]) if(grid[row+i][col+j]==1) dfs(grid, row+i, col+j, cnt); } return; } int get_biggest_region(vector< vector<int> > grid) { int row = grid.size(), col = grid[0].size(), mx=0, tmp; memset(vis, 0, sizeof(vis)); for(int i=0;i<row;i++) for(int j=0;j<col;j++) if(!vis[i][j] && grid[i][j]) { tmp=0; dfs(grid, i, j, &tmp); mx = max(mx, tmp); } return mx; } int main(){ cin >> n; cin >> m; vector< vector<int> > grid(n,vector<int>(m)); for(int grid_i = 0;grid_i < n;grid_i++){ for(int grid_j = 0;grid_j < m;grid_j++){ cin >> grid[grid_i][grid_j]; } } cout << get_biggest_region(grid) << endl; return 0; }
Saturday, 22 October 2016
Ice Cream Parlor (CTCI)
Problem: Ice Cream Parlor
#include <bits/stdc++.h> using namespace std; class IceCream { public: int flavor; int index; IceCream(int flavor, int index) { this->flavor = flavor; this->index = index; } }; int binarySearch(int first, int last, vector<IceCream> arr, int search) { int mid; while(first<=last) { mid = (first+last)>>1; if(arr[mid].flavor == search) return arr[mid].index; if(arr[mid].flavor < search) first = mid+1; else last = mid-1; } return -1; } bool compare(IceCream a, IceCream b) { if(a.flavor != b.flavor) return a.flavor<b.flavor; return a.index<b.index; } int main() { int t; int n, m; cin >> t; for(int test = 0; test < t; test++) { cin >> m >> n; vector<IceCream> arr; arr.reserve(n); for (int i = 0; i < n; i++) { int cost; cin >> cost; arr.push_back(IceCream(cost, i + 1)); } sort(arr.begin(), arr.end(), compare); for(int i = 0; i < n - 1 ; i++) { int search = m - arr[i].flavor; if(search >= arr[i].flavor) { int index = binarySearch( i + 1, n - 1, arr, search); if( index != -1 ) { cout << min(arr[i].index, index) << " " << max(arr[i].index, index) << endl; break; } } } } }
Counting Inversions (CTCI)
Problem: Counting Inversions
long long merge(vector<int> *a, int st, int mid, int ed) { vector<int> v(ed-st+1); long long cnt=0; int i=st, j=mid+1, vi=0; while(i<=mid && j<=ed) { if(a->at(i) <= a->at(j)) v[vi++] = a->at(i++); else { cnt += mid-i+1; v[vi++] = a->at(j++); } } while(i <= mid) v[vi++] = a->at(i++); while(j <= ed) v[vi++] = a->at(j++); for(int i=0;i<vi;i++) a->at(st++) = v[i]; return cnt; } long long mergeSort(vector<int> *a, int st, int ed) { if(st>=ed) return 0; long long cnt=0; int mid = st + (ed-st)/2; cnt += mergeSort(a, st, mid); cnt += mergeSort(a, mid+1, ed); cnt += merge(a, st, mid, ed); return cnt; } long long count_inversions(vector<int> a) { int al = a.size(); return mergeSort(&a, 0, al-1); } int main(){ int t; cin >> t; for(int a0 = 0; a0 < t; a0++){ int n; cin >> n; vector<int> arr(n); for(int arr_i = 0;arr_i < n;arr_i++){ cin >> arr[arr_i]; } cout << count_inversions(arr) << endl; } return 0; }
Subscribe to:
Posts (Atom)