为什么手写栈会错#29#30?
查看原帖
为什么手写栈会错#29#30?
1183187
sxhy楼主2024/3/30 17:23

stl的栈100分

#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
int n, m, dfn[N], low[N],cnt, tot, top, cut[N];
int root;

struct edge {
	int u, v;
};
vector<edge>e;
vector<int>h[2 * N], edcc[N];
stack<int>stk;
void add(int a, int b) {
	e.push_back({ a,b });
	h[a].push_back(e.size() - 1);
}
void tarjan(int x, int inedge) {
	dfn[x] = low[x] = ++tot;
	stk.push(x);
	for (int i = 0; i < h[x].size(); i++) {
		int bian = h[x][i], v = e[bian].v;
		if (!dfn[v]) {
			tarjan(v, bian);
			low[x] = min(low[x], low[v]);
			if (low[v] > dfn[x]) {
				cut[bian] = cut[(bian ^ 1)] = 1;
			}
		}
		else if (bian != (inedge ^ 1)) {
			low[x] = min(low[x], dfn[v]);
		}
	}
	if (low[x] == dfn[x]) {
		int y;
		cnt++;
		while (1) {
			y = stk.top(), stk.pop();
			edcc[cnt].push_back(y);
			if (y == x)break;
		}

	}


}
int main() {
	int a, b;
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> a >> b;
		add(a, b), add(b, a);
	}
	for (int i = 1; i <= n; i++) {
		if (!dfn[i])tarjan(i, 0);
	}
	cout << cnt << "\n";
	for (int i = 1; i <= cnt; i++) {
		cout << edcc[i].size() << " ";
		for (int j = 0; j < edcc[i].size(); j++) {
			cout << edcc[i][j] << " ";
		}
		puts("");
	}

}

手写栈89分

#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
int n, m, dfn[N], low[N], stk[N], cnt, tot, top, cut[N];
int root;

struct edge {
	int u, v;
};
vector<edge>e;
vector<int>h[2 * N], edcc[N];
void add(int a, int b) {
	e.push_back({ a,b });
	h[a].push_back(e.size() - 1);
}
void tarjan(int x, int inedge) {
	dfn[x] = low[x] = ++tot;
	stk[++top] = x;
	for (int i = 0; i < h[x].size(); i++) {
		int bian = h[x][i], v = e[bian].v;
		if (!dfn[v]) {
			tarjan(v, bian);
			low[x] = min(low[x], low[v]);
			if (low[v] > dfn[x]) {
				cut[bian] = cut[(bian ^ 1)] = 1;
			}
		}
		else if (bian != (inedge ^ 1)) {
			low[x] = min(low[x], dfn[v]);
		}
	}
	if (low[x] == dfn[x]) {
		int y;
		cnt++;
		while (1) {
			y = stk[top];
			top--;
			edcc[cnt].push_back(y);
			if (y == x)break;
		}

	}


}
int main() {
	int a, b;
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> a >> b;
		add(a, b), add(b, a);
	}
	for (int i = 1; i <= n; i++) {
		if (!dfn[i])tarjan(i, 0);
	}
	cout << cnt << "\n";
	for (int i = 1; i <= cnt; i++) {
		cout << edcc[i].size() << " ";
		for (int j = 0; j < edcc[i].size(); j++) {
			cout << edcc[i][j] << " ";
		}
		puts("");
	}

}
2024/3/30 17:23
加载中...