【算法】有向图最大环数+有向图找环+C实例

有向图如下

【算法】有向图最大环数+有向图找环+C实例_第1张图片

要求找出最大环中节点的个数,比如0-1-2-3构成一个环,0-1构成一个环,

其中0-1-2-3是最大环,环数为4
 


visit数组表示当前点的状态 

0 表示还没访问过

1 表示正在访问

-1 表示访问结束

 

递归遍历的实现

#include
#include
using namespace std;
vector> map;//邻接矩阵
vector visit;// 状态数组
vector path;//环的元素 
int v, e;
int m = 0;
int max = 0;
void dfs(int k) {
	visit[k] = 1;
	path[m++] = k;
	for (int i = 0; i < v; i++) {
		if (map[k][i] == 1) {
			if (visit[i] == 0) {
				dfs(i);
			}
			if (visit[i] == 1) {
				cout << "环:";
				int cnt = 0;
				for (int j = m - 1;; j--) {
					cout << path[j] << ' ';
					cnt++;
					if (path[j] == i) {
						break;
					}
				}
				cout << endl;
				if (cnt > max) {
					max = cnt;
				}
			}
			if (visit[i] == 0) {
				continue;
			}
		}
	}
	visit[k] = -1;
	m--;
}
int main() {
	while (cin >> v >> e) {
		vector>(v, vector(v, 0)).swap(map);
		vector(v, 0).swap(visit);
		vector(v, 0).swap(path);
		
		for (int i = 1; i <= e; i++) {
			int a, b;
			cin >> a >> b;
			map[a][b] = 1;
		}
		cout << endl;
		for (int i = 0; i < v; i++) {
			for (int j = 0; j < v; j++) {
				cout << map[i][j] << " ";
			}
			cout << endl;
		}
		cout << endl;
		for (int i = 0; i < v; i++) {
			if (visit[i] != -1)
				dfs(i);
		}
		cout << max << endl;
		max = 0;
	}
	return 0;
}

【算法】有向图最大环数+有向图找环+C实例_第2张图片

5 7
0 1
1 0
1 4
2 1
2 3
3 0
4 3

0 1 0 0 0
1 0 0 0 1
0 1 0 1 0
1 0 0 0 0
0 0 0 1 0

环:1 0
环:3 4 1 0
4

 

你可能感兴趣的:(算法)