發現環(並查集)

#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<sstream>
#include<cassert>
using namespace std;
const int maxn = 1000 + 5;
const int INF = 10000000;
typedef long long ll;
int n;
vector<int>G[maxn];
int vis[maxn];
int p = 0, q = 0;
int route[maxn];
int len = 0;
int f[maxn];
void init() {
	for (int i = 1; i <= n; i++) {
		f[i] = i;
	}
}
int find(int x) {
	if (x != f[x]) {
		f[x] = find(f[x]);
	}
	return f[x];
}
int unionsearch(int x) {
	while (x != f[x]) {
		x = f[x];
	}
	return x;
}
void merage(int x, int y) {
	int a = unionsearch(x);
	int b = unionsearch(y);
	if (a != b) {
		f[a] = b;
	}
}

bool dfs(int u,int pre) {
	if (u == pre) { return true; }
	for (int i = 0; i < G[u].size(); i++) {
		if (!vis[G[u][i]]) {
			vis[G[u][i]] = 1;
			route[len++] = G[u][i];
			if (dfs(G[u][i], pre))return true;
			len--;
			vis[G[u][i]] = 0;
		}
	}
	return false;
}
int main() {
	while (cin >> n && n) {
		int u, v;
		memset(vis, 0, sizeof(vis));
		init();
		len = 0;
		for (int i = 0; i < n; i++)G[i].clear();
		for (int i = 0; i < n; i++) {
			cin >> u >> v;
			G[u].push_back(v);
			G[v].push_back(u);
			if (find(u) != find(v)) {
				merage(u, v);
			}
			else break;
		}
		route[len++] = u;
		dfs(u, v);
		sort(route, route + len);
		for (int i = 0; i < len-1; i++) {
			cout << route[i] << " ";
		}
		cout << route[len - 1] << endl;
		
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章