将无向图转换为有向图,以便在C ++中不存在长度大于1的路径
在本教程中,我们将讨论一个程序,该程序将无向图转换为有向图,以使路径的长度不大于1。
为此,我们将提供一个无向图。我们的任务是在没有路径的长度大于1的情况下将该图转换为直接图。
示例
#include <bits/stdc++.h>
using namespace std;
#define N 100005
//存储图
vector<int> gr[N];
//存储每个顶点的颜色
int colour[N];
vector<pair<int, int> > edges;
bool bip;
//在图上添加边
void add_edge(int x, int y){
gr[x].push_back(y);
gr[y].push_back(x);
edges.push_back(make_pair(x, y));
}
//检查给定图
//是二分的
void dfs(int x, int col){
colour[x] = col;
//移到子顶点
for (auto i : gr[x]) {
if (colour[i] == -1)
dfs(i, col ^ 1);
//如果孩子和父母有
//同一分支
else if (colour[i] == col)
bip = false;
}
}
//转换成直接图
void convert_directed(int n, int m){
memset(colour, -1, sizeof colour);
bip = true;
//调用双向函数
dfs(1, 1);
if (!bip) {
cout << -1;
return;
}
//如果可能二分
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