Skip to content

Added Some algorithms. Changed Some. (Graph Directory) #631

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 51 additions & 73 deletions Graph/Dijsktra.cpp
Original file line number Diff line number Diff line change
@@ -1,84 +1,62 @@
#include<bits/stdc++.h>
using namespace std;
#include <bits/stdc++.h>

#define f(i,x,n) for(int i=x;i<n;i++)
#define ll long long
#define pb(i) push_back(i)
#define mp(i,j) make_pair(i,j)
#define test ll t; cin>>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<int> vi;
typedef std::vector<long long> vll;
typedef std::pair<int, int> pii;
typedef std::pair<ll, ll> pllll;
typedef std::set<int> si;
typedef std::set<ll> sll;
typedef std::unordered_map<int , int> mii;
typedef std::unordered_map<ll , ll> mllll;
typedef std::unordered_map<char , int> mci;
typedef std::unordered_map<char , ll> mcll;

void print(int dist[])
{
cout<<"Vertex \t\t Distance from Source"<<endl;

f(i,0,v)
{
cout<<i<<"\t\t "<<dist[i]<<endl;
}
}
ll N;
bool vis[MAXN];
vll dist(MAXN);
std::vector<pllll> 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]<dist[j])
{
dist[j] = dist[u] + g[u][j];
}
}
}

print(dist);
void dijkstra(int s) {
FOR(i, 0, N) {
dist[i] = INF;
vis[i] = false;
}
std::priority_queue<pllll> 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;
}
162 changes: 76 additions & 86 deletions Graph/Kruskal's(MST).cpp
Original file line number Diff line number Diff line change
@@ -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<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#include <bits/stdc++.h>

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<n;i++){
parent[i]=-1;
rank[i]=1;
}
}
typedef long long ll;
typedef std::vector<int> vi;
typedef std::vector<long long> vll;
typedef std::pair<int, int> pii;
typedef std::pair<ll, ll> pllll;
typedef std::set<int> si;
typedef std::set<ll> sll;
typedef std::unordered_map<int , int> mii;
typedef std::unordered_map<ll , ll> mllll;
typedef std::unordered_map<char , int> mci;
typedef std::unordered_map<char , ll> 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<std::tuple<ll, ll, ll>> 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]<rank[s2]){
parent[s1]=s2;
rank[s2]+=rank[s1];
}
else
{
parent[s2]=s1;
rank[s1]+=rank[s2];
}
}
}
void unite(ll a, ll b) {
a = find(a);
b = find(b);

//By rank
if(a != b) {
if(rank[a] < rank[b])
std::swap(a, b);
parent[b] = a;
if(rank[a] == rank[b])
rank[a]++;
}

};
class Graph{
vector<vector<int>>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<<g.kruskal_mst()<<endl;
return 0;
}
int main()
{
return 0;
}
52 changes: 52 additions & 0 deletions Graph/bfsQueue.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#include <bits/stdc++.h>

#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<int> vi;
typedef std::vector<long long> vll;
typedef std::pair<int, int> pii;
typedef std::pair<ll, ll> pllll;
typedef std::set<int> si;
typedef std::set<ll> sll;
typedef std::unordered_map<int , int> mii;
typedef std::unordered_map<ll , ll> mllll;
typedef std::unordered_map<char , int> mci;
typedef std::unordered_map<char , ll> mcll;

ll N;
bool seen[MAXN];
vll dist(MAXN), adj[MAXN];

void bfs(int x) {
std::queue<ll> 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;
}
Loading