diff --git a/Graph/Dijsktra.cpp b/Graph/Dijsktra.cpp index 376ae12..ba4be5b 100644 --- a/Graph/Dijsktra.cpp +++ b/Graph/Dijsktra.cpp @@ -1,84 +1,62 @@ -#include -using namespace std; +#include -#define f(i,x,n) for(int i=x;i>t; while(t--) +#define dbg(x) cerr << #x << ": " << x << endl; +#define FOR(i, a, b) for(int i = (a); i < (b); ++i) +#define FORD(i, a, b) for(int i = (a); i >= (b); --i) +#define all(v) (v).begin(), (v).end() +#define rall(v) (v).rbegin(), (v).rend() +#define pb push_back +#define mp make_pair +#define fi first +#define se second -#define v 9 +#define INF 1000000000 +#define MAXN 1000005 +#define EPS 1e-9 -int minDistance(int dist[], bool visited[]) -{ - int min = INT_MAX, minIndex; - - f(i,0,v) - { - if (visited[i]==false && dist[i]<=min) - { - min = dist[i]; - minIndex = i; - } - } - - return minIndex; -} +typedef long long ll; +typedef std::vector vi; +typedef std::vector vll; +typedef std::pair pii; +typedef std::pair pllll; +typedef std::set si; +typedef std::set sll; +typedef std::unordered_map mii; +typedef std::unordered_map mllll; +typedef std::unordered_map mci; +typedef std::unordered_map mcll; -void print(int dist[]) -{ - cout<<"Vertex \t\t Distance from Source"< adj_dijkstra[MAXN]; //{v, w} -void dijsktra(int g[][v], int s) -{ - int dist[v]; - bool visited[v]; - - f(i,0,v) - { - dist[i] = INT_MAX; - visited[i] = false; - } - - dist[s] = 0; - - f(i,0,v-1) - { - int u = minDistance(dist,visited); - visited[u] = true; - - f(j,0,v) - { - if (!visited[j] && g[u][j] && dist[u]!=INT_MAX && dist[u]+g[u][j] q; //{w, v} + dist[s] = 0; + q.push({0, s}); + while(!q.empty()) { + ll u = q.top().se; q.pop(); + if(vis[u]) continue; + vis[u] = true; + for(auto pr : adj_dijkstra[u]) { + ll v, w; + std::tie(v, w) = pr; + if(vis[v]) continue; + + if(dist[u] + w < dist[v]) { + dist[v] = dist[u] + w; + q.push({-dist[v], v}); + } + } + } } int main() { - int g[v][v] = { { 0, 4, 0, 0, 0, 0, 0, 8, 0 }, - { 4, 0, 8, 0, 0, 0, 0, 11, 0 }, - { 0, 8, 0, 7, 0, 4, 0, 0, 2 }, - { 0, 0, 7, 0, 9, 14, 0, 0, 0 }, - { 0, 0, 0, 9, 0, 10, 0, 0, 0 }, - { 0, 0, 4, 14, 10, 0, 2, 0, 0 }, - { 0, 0, 0, 0, 0, 2, 0, 1, 6 }, - { 8, 11, 0, 0, 0, 0, 1, 0, 7 }, - { 0, 0, 2, 0, 0, 0, 6, 7, 0 } }; - - //source vertex is 0 - dijkstra(g,0); - return 0; } diff --git a/Graph/Kruskal's(MST).cpp b/Graph/Kruskal's(MST).cpp index f4e6e0a..432c9a3 100644 --- a/Graph/Kruskal's(MST).cpp +++ b/Graph/Kruskal's(MST).cpp @@ -1,96 +1,86 @@ -//weighted undirected graph -//greedy algorithm -//spanning tree which connects all vertices of graph i.e v-1 edges , no cycles , subsets of edges -//single connected edges -#include -#include -#include -using namespace std; +#include -class DSU{ - int *parent; - int *rank; +#define dbg(x) cerr << #x << ": " << x << endl; +#define FOR(i, a, b) for(int i = (a); i < (b); ++i) +#define FORD(i, a, b) for(int i = (a); i >= (b); --i) +#define all(v) (v).begin(), (v).end() +#define rall(v) (v).rbegin(), (v).rend() +#define pb push_back +#define mp make_pair +#define fi first +#define se second -public: - DSU(int n){ - parent=new int[n]; - rank=new int[n]; +#define INF 1000000000 +#define MAXN 1000005 +#define EPS 1e-9 - //parent -1,rank 1 - for(int i=0;i vi; +typedef std::vector vll; +typedef std::pair pii; +typedef std::pair pllll; +typedef std::set si; +typedef std::set sll; +typedef std::unordered_map mii; +typedef std::unordered_map mllll; +typedef std::unordered_map mci; +typedef std::unordered_map mcll; - //find function -int find(int i){ - if(parent[i]==-1){ - return i; - } - //otherwise - return parent[i]=find(parent[i]); +ll N; +vll rank(MAXN), size(MAXN), parent(MAXN); +std::vector> edges; + +//Helping functions +void init() { + FOR(i, 0, N) { + parent[i] = i; + size[i] = 1; + rank[i] = 0; + } +} + +ll find(int a) { + if(a == parent[a]) return a; + return parent[a] = find(parent[a]); } - //unite (union) - void unite(int x,int y){ - int s1=find(x); - int s2=find(y); - if(s1!=s2){ - //union by rank - if(rank[s1]>edgelist; - int V; - public: - Graph(int V){ - this->V=V; - } - void addEdge(int x,int y,int w){ - edgelist.push_back({w,x,y}); - } - int kruskal_mst(){ - //sort all the edges - sort(edgelist.begin(),edgelist.end()); - //init a DSU - DSU s(V); + //By size + if(a != b) { + if(size[a] < size[b]) + std::swap(a, b); + parent[b] = a; + size[a] += size[b]; + } +} - int ans=0; - for(auto edge:edgelist){ - int w=edge[0]; - int x=edge[1]; - int y=edge[2]; - //take that edge in MST if it doesnt form a cycle - if(s.find(x)!=s.find(y)){ - s.unite(x,y); - ans+=w; - } - } - return ans; - } - }; +bool same(ll a, ll b) { + return find(a) == find(b); +} - int main(){ - Graph g(4); - g.addEdge(0,1,1); - g.addEdge(1,3,3); - g.addEdge(3,2,4); - g.addEdge(2,0,2); - g.addEdge(0,3,2); - g.addEdge(1,2,2); +//Actual Kruskal +void kruskal() { + std::sort(all(edges)); + for(auto edge : edges) { + ll u, v, w; + std::tie(w, u, v) = edge; + if(!same(u, v)) unite(u, v); + } +} - cout< + +#define dbg(x) cerr << #x << ": " << x << endl; +#define FOR(i, a, b) for(int i = (a); i < (b); ++i) +#define FORD(i, a, b) for(int i = (a); i >= (b); --i) +#define all(v) (v).begin(), (v).end() +#define rall(v) (v).rbegin(), (v).rend() +#define pb push_back +#define mp make_pair +#define fi first +#define se second + +#define INF 1000000000 +#define MAXN 1000005 +#define EPS 1e-9 + +typedef long long ll; +typedef std::vector vi; +typedef std::vector vll; +typedef std::pair pii; +typedef std::pair pllll; +typedef std::set si; +typedef std::set sll; +typedef std::unordered_map mii; +typedef std::unordered_map mllll; +typedef std::unordered_map mci; +typedef std::unordered_map mcll; + +ll N; +bool seen[MAXN]; +vll dist(MAXN), adj[MAXN]; + +void bfs(int x) { + std::queue q; + seen[x] = true; + dist[x] = 0; + q.push(x); + while(!q.empty()) { + ll u = q.front(); q.pop(); + for(auto v : adj[u]) { + if(seen[v]) continue; + seen[v] = true; + dist[v] = dist[u] + 1; + q.push(v); + } + } +} + +int main() +{ + return 0; +} diff --git a/Graph/dfsStack.cpp b/Graph/dfsStack.cpp new file mode 100644 index 0000000..f5fb068 --- /dev/null +++ b/Graph/dfsStack.cpp @@ -0,0 +1,50 @@ +#include + +#define dbg(x) cerr << #x << ": " << x << endl; +#define FOR(i, a, b) for(int i = (a); i < (b); ++i) +#define FORD(i, a, b) for(int i = (a); i >= (b); --i) +#define all(v) (v).begin(), (v).end() +#define rall(v) (v).rbegin(), (v).rend() +#define pb push_back +#define mp make_pair +#define fi first +#define se second + +#define INF 1000000000 +#define MAXN 1000005 +#define EPS 1e-9 + +typedef long long ll; +typedef std::vector vi; +typedef std::vector vll; +typedef std::pair pii; +typedef std::pair pllll; +typedef std::set si; +typedef std::set sll; +typedef std::unordered_map mii; +typedef std::unordered_map mllll; +typedef std::unordered_map mci; +typedef std::unordered_map mcll; + +ll N; +vll adj[MAXN]; +bool seen[MAXN]; + +void dfs(int x) { + std::stack s; + seen[x] = true; + s.push(x); + while(!s.empty()) { + ll u = s.top(); s.pop(); + for(auto v : adj[u]) { + if(seen[v]) continue; + seen[v] = true; + s.push(v); + } + } +} + +int main() +{ + return 0; +} diff --git a/Graph/topoSortKahn.cpp b/Graph/topoSortKahn.cpp new file mode 100644 index 0000000..a2e8628 --- /dev/null +++ b/Graph/topoSortKahn.cpp @@ -0,0 +1,68 @@ +#include + +#define dbg(x) cerr << #x << ": " << x << endl; +#define FOR(i, a, b) for(int i = (a); i < (b); ++i) +#define FORD(i, a, b) for(int i = (a); i >= (b); --i) +#define all(v) (v).begin(), (v).end() +#define rall(v) (v).rbegin(), (v).rend() +#define pb push_back +#define mp make_pair +#define fi first +#define se second + +#define INF 1000000000 +#define MAXN 1000005 +#define EPS 1e-9 + +typedef long long ll; +typedef std::vector vi; +typedef std::vector vll; +typedef std::pair pii; +typedef std::pair pllll; +typedef std::set si; +typedef std::set sll; +typedef std::unordered_map mii; +typedef std::unordered_map mllll; +typedef std::unordered_map mci; +typedef std::unordered_map mcll; + +ll N; +vll adj[MAXN]; + +void toposort() { + vll indegree(N); + FOR(i, 0, N) { + for(auto it : adj[i]){ + indegree[it]++; + } + } + + std::queue q; + FOR(i, 0, N) { + if(indegree[i] == 0) + q.push(i); + } + + vll result; + while(!q.empty()) { + ll node = q.front(); q.pop(); + result.pb(node); + + for(auto it : adj[node]){ + indegree[it]--; + + if(indegree[it] == 0) + q.push(it); + } + } + + if(result.size() != N) + std::cout<<"Cycle Detected"; + else + std::cout<<"No Cycle"; +} + +int main() +{ + return 0; +}