let's start Code

Showing posts with label Graph Theory. Show all posts
Showing posts with label Graph Theory. Show all posts

0-1 BFS

Resources:

Cf blog

Shakil Ahmed blog

cp_algorithm 

Youtube 

vjudge contest 

GFG 

Implementation:



Share:

Round Trip

Share:

D - Coloring Edges on Tree

Problem link: Coloring Edges on Tree

Explanation: GfG

Implementation:


Share:

ICPC Dhaka Regional- 2019

Share:

1049 - One Way Roads

1049 - One Way Roads

Topic: DFS

concept: কস্টকে ডিরেক্টটেড ধরবো তারপর আনডিক্টটেড গ্রাফ এ ডিএফএস চালাবো.

Share:

TOPOSORT - Topological Sorting

Share:

Topological Sorting

                                                 Resource Link

Topological Sorting (E-Maxx)

Kahn’s algorithm for Topological Sorting

Topological Sorting

TopSort using DFS:


TopSort using BFS: (Kahn’s algorithm)

Share:

1002 - Country Roads

1002 - Country Roads

Topic: dijkstra

solution 01:


Share:

Dijkstra Algorithm

                                               Resource Link

Dijkstra Algorithm

Dijkstra on sparse graphs


Share:

Kruskal’s Algorithm [ Minimum Spanning Tree ]

Kruskal’s Algorithm [ Minimum Spanning Tree ]

গ্রাফ থিওরিতে হাতেখড়ি ৬: মিনিমাম স্প্যানিং ট্রি(ক্রুসকাল অ্যালগোরিদম)

Visualization

Hackerearth

Implementation 01:

 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include<bits/stdc++.h>
using namespace std;
const int maxn = (int) 2e5 + 5;

struct edge
{
    int u,v,w;
};

vector<edge>graph, output;
int parent[maxn], mstValue = 0;

bool cmp (edge a, edge b)
{
    return a.w < b.w;
}

int Find(int r)
{
    if(parent[r] == r)
        return r;
    return parent[r] = Find(parent[r]);
}

void initPar(int r)
{
    for(int i = 0; i <= r; i++)parent[i] = i;
}

void kruskals_Algorithm(int n)
{
    sort(graph.begin(), graph.end(), cmp);
    for(int i = 0; i < (int)graph.size(); i++){
        cout << graph[i].u << " "<<graph[i].v << " "<< graph[i].w<<endl;
    }
    initPar(n);
    int cnt = 0;

    for(int i = 0; i < (int)graph.size(); i++){
        int uPr = Find(graph[i].u);
        int vPr = Find(graph[i].v);

        if(uPr != vPr){
            if(cnt == n-1) break;

            output.push_back(graph[i]);
            mstValue += graph[i].w;
            parent[uPr] = vPr;
            cnt++;
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
   cout.tie(nullptr);
   // freopen("in.txt", "r", stdin);

    int n,e;
    cin >> n >> e;
    cout << n << " & " << e << endl;
    for(int i = 0; i < e; i++){
        int u,v,w;
        cin >> u >> v >> w;
        edge input;
        input.u = u;
        input.v = v;
        input.w = w;
        graph.push_back(input);
    }

    kruskals_Algorithm(n);

    cout << "MST Value : " << mstValue << endl;

    for(int i = 0; i < (int)output.size(); i++){
        cout << output[i].u << " "<<output[i].v << " "<< output[i].w<<endl;
    }

    return 0;
}

Implementation 02:




 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include<bits/stdc++.h>
using namespace std;

const int MAX = 300005;
int id[MAX], nodes, edges, idx;

pair <int, pair<int, int> > p[MAX], output[MAX];

void initialize()
{
    for(int i = 0; i < MAX; i++)
    {
        id[i] = i;
    }
}

int root(int x)
{
    while(id[x] != x)
    {
        id[x] = id[ id[x] ];
        x = id[x];
    }
    return x;
}

void union1(int x, int y)
{
    int p = root(x);
    int q = root(y);
    id[p] = id[q];
}

int kruskal(pair <int, pair<int, int> > p[])
{
    idx = 0;
    int x,y;
    int cost, minimumcost = 0;

    for(int i = 0; i < edges; i++)
    {
        /// selecting edges one by one in increasing order from the beginning.
        x = p[i].second.first;
        y = p[i].second.second;
        cost = p[i].first;
        /// check if the selected edge is creating a cycle or not
        if(root(x) != root(y))
        {
            minimumcost += cost;
            output[idx++] = make_pair(cost, make_pair(x,y));
            union1(x,y);
        }
    }
    return minimumcost;
}

int main()
{
   // freopen("in.txt", "r", stdin);

        int x,y;
        int weight,cost,minimumcost,price;
        initialize();
        scanf("%d %d", &nodes, &edges);
        //cout << nodes << " & "<<edges<<endl;
        for(int i = 0; i < edges; i++)
        {
            cin >> x >> y >> weight;
            p[i] = make_pair(weight, make_pair(x,y));
        }
        sort(p, p+edges);
       // for(int i = 0; i < edges; i++){
           // cout << p[i].second.first << " "<<p[i].second.second << " "<<p[i].first<<endl;
        //}
        minimumcost = kruskal(p);
        cout << "MST :- ";
        cout << minimumcost<<endl;
        for(int i = 0; i < idx; i++){
            cout << output[i].second.first << " "<<output[i].second.second << " "<< output[i].first << endl;
        }
    return 0;
}

Share:

315 - Network

315 - Network

Topic : Graph Theory(AP)

Solution 01:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<bits/stdc++.h>
using namespace std;

#define Max 100000
vector<int> graph[Max];
int parent[Max];
int low[Max];
int d[Max];
int visited[Max];
bool isArticulationPoint[Max];
int Time = 0;

void dfs(int u, int root)
{
    Time = Time + 1;
    visited[u] = Time;
    d[u] = low[u] = Time;
    int noOfChildren = 0;
    for(int i = 0; i <graph[u].size(); i++){
        int v = graph[u][i];
        if(v == parent[u])continue;
        parent[v] = u;
        if(visited[v]) low[u] = min(low[u], d[v]);
        else{
            noOfChildren = noOfChildren + 1;
            dfs(v, root);
            low[u] = min(low[u], low[v]);
            if(low[v] >= d[u] and u != root)isArticulationPoint[u] = true;
        }
    }
    if(u == root and noOfChildren > 1)isArticulationPoint[u] = true;
}

int main()
{
    int n,x,y;
    char c;
    while(cin >> n && n)
    {
        Time = 0;
        for(int t = 0; t <= n; t++){
            graph[t].clear();
            parent[t]= low[t] = d[t] = visited[t] = 0;
            isArticulationPoint[t] = false;
        }
        while(scanf("%d", &x) == 1 && x)
        {
            while(scanf("%d%c", &y, &c) == 2)
            {
                graph[x].push_back(y);
                    graph[y].push_back(x);
                if(c == '\n') break;
            }
        }
        dfs(1, 1);
        cout << count(isArticulationPoint+1, isArticulationPoint+n+1, true)<<endl;
    }
    return 0;
}

Share:

Articulation Points and Bridges

Resource:

বাইকানেক্টেড কম্পোনেন্ট , ব্রিজ, আরটিকুলেশন পয়েন্ট [ থিওরি ]

গ্রাফ থিওরিতে হাতেখড়ি ১৩: আর্টিকুলেশন পয়েন্ট এবং ব্রিজ

Visualization

CF blog 

Finding bridges in a graph in O(N+M)

Finding articulation points in a graph in O(N+M)

Articulation Points:01


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<bits/stdc++.h>
using namespace std;

#define Max 100000
vector<int> graph[Max];
int parent[Max];
int low[Max];
int d[Max];
int visited[Max];
bool isArticulationPoint[Max];
int Time = 0;

void dfs(int u, int root)
{
    Time = Time + 1;
    visited[u] = Time;
    d[u] = low[u] = Time;
    int noOfChildren = 0;
    for(int i = 0; i <graph[u].size(); i++){
        int v = graph[u][i];
        if(v == parent[u])continue;
        parent[v] = u;
        if(visited[v]) low[u] = min(low[u], d[v]);
        else{
            noOfChildren = noOfChildren + 1;
            dfs(v, root);
            low[u] = min(low[u], low[v]);
            if(low[v] >= d[u] and u != root)isArticulationPoint[u] = true;
        }
    }
    if(u == root and noOfChildren > 1)isArticulationPoint[u] = true;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
  //  freopen("in.txt", "r", stdin);
    int n,e;
    cin >> n >> e;
    for(int i = 0; i < e; i++){
        int u,v;
        cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }
    dfs(1,1);
    for(int i = 1; i <= n; i++){
        if(isArticulationPoint[i])cout << i<<endl;
    }
    return 0;
}

Bridge 01:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include<bits/stdc++.h>
using namespace std;

#define Max 100000
vector<int> graph[Max];
vector<pair<int, int> > Bridge;
int parent[Max];
int low[Max];
int d[Max];
int visited[Max];
bool isArticulationPoint[Max];
int Time = 0;

void dfs(int u, int root)
{
    int v;
    Time = Time + 1;
    visited[u] = Time;
    d[u] = low[u] = Time;
    int noOfChildren = 0;
    for(int i = 0; i <graph[u].size(); i++){
         v = graph[u][i];
        if(v == parent[u])continue;
        parent[v] = u;
        if(visited[v]) low[u] = min(low[u], d[v]);
        else{
            noOfChildren = noOfChildren + 1;
            dfs(v, root);
            low[u] = min(low[u], low[v]);
            if(low[v] > d[u])
            {
                isArticulationPoint[u] = true;
             //    cout << u << "-------"<<v<<endl;
                 Bridge.push_back({u,v});
            }
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    //freopen("in.txt", "r", stdin);
    int n,e;
    cin >> n >> e;
    for(int i = 0; i < e; i++){
        int u,v;
        cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }
    dfs(1,1);
    for(int i = 0; i < Bridge.size(); i++){
        cout << Bridge[i].first << " "<<Bridge[i].second<<endl;
    }
    return 0;
}

Share:

802. Find Eventual Safe States


802. Find Eventual Safe States

 

Solution: DFS

concept:

যেই নোডগুলোতে সাইকেল নাই ওই গুলা প্রিন্ট করতে হবে।

Code:

class Solution {
public:
   
    unordered_set<int> cycle_nodes, safe_nodes;
   
    bool dfs(vector<vector<int>>& g, int i, unordered_set<int>visited_nodes)
    {
        if(safe_nodes.find(i) != safe_nodes.end())return true;
        if(cycle_nodes.find(i) != cycle_nodes.end())return false;
       
        if(visited_nodes.find(i) != visited_nodes.end()){
            cycle_nodes.insert(i);
            return false;
        }
       
        visited_nodes.insert(i);
        for(int node : g[i]){
            if(!dfs(g, node, visited_nodes)){
                cycle_nodes.insert(i);
                return false;
            }
        }
        safe_nodes.insert(i);
        return true;
    }
   
    vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
        unordered_set<int>visited_nodes;
        vector<int>ans;
       
        for(int i = 0; i < graph.size(); i++){
            if(dfs(graph, i,visited_nodes))ans.push_back(i);
        }
        return ans;
    }
};


Share:

UVA-10004

#include<bits/stdc++.h>
using namespace std;
int main()
{
    while(1)
    {
        int n,a;
        cin >> n;
        if(n == 0)
        {
            return 0;
        }
        cin >> a;
        int ck = 0;
        vector<int> edge[201];
        for(int i = 0; i < a; i++)
        {
            int p,q;
            cin>>p>>q;
            if(i == 0)ck = p;
            edge[q].push_back(p);
            edge[p].push_back(q);
        }
        int color[201];
        int is = true;
        while(1)
        {
            for (int i = 0; i < 200; ++i)
            {
                color[i] = -1;
            }
            color[ck] = 1;
            queue<int>q;
            while(!q.empty())q.pop();
            q.push(ck);
            while(!q.empty())
            {
                int u = q.front();
                // cout<<u<<" //// ";
                q.pop();
//        if(edge[u][u] == 1)return false;
                //cout<<edge[u].size()<<endl;
                for(int i = 0; i < edge[u].size(); i++)
                {
                    int v = edge[u][i];
                    //cout<<color[v]<<" "<<color[u]<<" --> "<<u<<" "<<v<<endl;
                    if(v != u && color[v] == -1)
                    {
                        color[v] = 1 - color[u];
                        q.push(v);
                    }
                    else if(color[v] == color[u] && u != v)
                    {
                        is =  false;
                        break;
                    }
                }
            }
            break;
        }
        if((is))
        {
            cout<<"BICOLORABLE.\n";
        }
        else
        {
            cout<<"NOT BICOLORABLE.\n";
        }
    }
    return 0;
}

Share:

About

let's start CODE

Popular Posts

Labels

Categories