感觉是相同的写法但是有锅,悬 2 关
查看原帖
感觉是相同的写法但是有锅,悬 2 关
345900
Haber楼主2023/8/21 21:54

这是 AC 代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=5e5+5;
vector<int> e[N];
int dfn[N],low[N],cnt;
stack<int> s;
int sum;
vector<int> vdcc[N];
void tarjan(int u){
	s.push(u);
	dfn[u]=low[u]=++cnt;
	for(int i=0;i<e[u].size();i++){
		int v=e[u][i];
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
			if(dfn[u]<=low[v]){
				sum++;
				s.push(u);
				while(s.top()!=v){
					vdcc[sum].push_back(s.top());
					s.pop();
				}
				vdcc[sum].push_back(s.top());
				s.pop();
			}
		}
		else low[u]=min(low[u],dfn[v]);
	}
	if(!e[u].size()) vdcc[++sum].push_back(u);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		if(a!=b) e[a].push_back(b),e[b].push_back(a);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
	printf("%d\n",sum);
	for(int i=1;i<=sum;i++){
		printf("%d ",vdcc[i].size());
		for(int j=0;j<vdcc[i].size();j++){
			printf("%d ",vdcc[i][j]);
		} 
		puts("");
	}
	return 0; 
} 

如果我中间弹栈的时候改成:

				sum++;
				while(s.top()!=u){
					vdcc[sum].push_back(s.top());
					s.pop();
				}
				vdcc[sum].push_back(s.top());
				s.pop();

样例#4 就有问题。

感谢 Dalao!

2023/8/21 21:54
加载中...