Computer >> Máy Tính >  >> Lập trình >> C ++

Chuyển đổi đồ thị vô hướng thành đồ thị có hướng sao cho không có đường dẫn nào có độ dài lớn hơn 1 trong C ++

Trong hướng dẫn này, chúng ta sẽ thảo luận về một chương trình chuyển đổi đồ thị vô hướng thành đồ thị có hướng sao cho không có đường dẫn nào có độ dài lớn hơn 1.

Đối với điều này, chúng tôi sẽ được cung cấp với một đồ thị vô hướng. Nhiệm vụ của chúng ta là chuyển đổi biểu đồ đó thành một biểu đồ trực tiếp vì không có đường dẫn nào có độ dài lớn hơn 1.

Ví dụ

#include <bits/stdc++.h>
using namespace std;
#define N 100005
//storing the graph
vector<int> gr[N];
//storing colour of each vertex
int colour[N];
vector<pair<int, int> > edges;
bool bip;
//adding edges to the graph
void add_edge(int x, int y){
   gr[x].push_back(y);
   gr[y].push_back(x);
   edges.push_back(make_pair(x, y));
}
//checking if the given graph
//is bipartite
void dfs(int x, int col){
   colour[x] = col;
   //moving to the child vertices
   for (auto i : gr[x]) {
      if (colour[i] == -1)
         dfs(i, col ^ 1);
      //if child and parent having
      //same branch
      else if (colour[i] == col)
         bip = false;
   }
}
//converting into direct graph
void convert_directed(int n, int m){
   memset(colour, -1, sizeof colour);
   bip = true;
   //calling bipartite function
   dfs(1, 1);
   if (!bip) {
      cout << -1;
      return;
   }
   //if bipartite is possible
   for (int i = 0; i < m; i++) {
      if (colour[edges[i].first] == 0)
         swap(edges[i].first, edges[i].second);
      cout << edges[i].first << " " << edges[i].second << endl;
   }
}
int main(){
   int n = 4, m = 3;
   add_edge(1, 2);
   add_edge(1, 3);
   add_edge(1, 4);
   convert_directed(n, m);
   return 0;
}

Đầu ra

1 2
1 3
1 4