C ++で1より大きい長さのパスがないように、無向グラフを有向グラフに変換します
このチュートリアルでは、1を超える長さのパスがないように、無向グラフを有向グラフに変換するプログラムについて説明します。
このために、無向グラフが提供されます。私たちのタスクは、パスの長さが1より大きい場合に、そのグラフを直接グラフに変換することです。
例
#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;
} 出力
1 2 1 3 1 4
-
すべてのサイクルをC++の無向グラフに出力します
この問題では、無向グラフが与えられ、グラフに形成されるすべてのサイクルを印刷する必要があります。 無向グラフ 互いに接続されたグラフです。一方向グラフのすべてのエッジは双方向です。無向ネットワークとも呼ばれます。 サイクル グラフのデータ構造は、すべての頂点がサイクルを形成するグラフです。 問題をよりよく理解するための例を見てみましょう- グラフ- 出力- Cycle 1: 2 3 4 5 Cycle 2: 6 7 8 このために、グラフのいくつかのプロパティを利用します。グラフ彩色法を使用して、閉路グラフで発生するすべての頂点に色を付ける必要があります。また、頂点
-
C++で指定された開始文字からの最長の連続パスの長さを検索します
異なる文字のマトリックスが与えられます。 1つの文字から始めて、現在の文字よりも大きいすべての文字をトラバースすることにより、最長のパスを見つける必要があります。文字は互いに連続しています。 Eから始まります。 最長のパスを見つけるために、深さ優先探索アルゴリズムを使用します。 DFS中に、いくつかのサブ問題が複数回発生する場合があります。そのサブ問題の計算を何度も回避するために、動的計画法のアプローチを使用します。 例 #include<iostream> #define ROW 3 #define COL 3 using namespace std; // tool