四处求调无果,遂发此帖
查看原帖
四处求调无果,遂发此帖
794148
cyx20091026楼主2025/1/19 21:39

最后两点TLE

必定关注帮助者!

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
int n,m;
struct EDGE{
	int to,nxt;
}edge[2000001];
int tot,cnt;
int head[500001];
int dfn[500001],low[500001];
vector<int>scc[1000001];
stack<int>st;
void add(int u,int v,int id){
	edge[id].nxt=head[u];
	edge[id].to=v;
	head[u]=id; 
}
void tarjan(int u,int fa){
	dfn[u]=low[u]=++tot;
	st.push(u);
	for(int i=head[u];i!=-1;i=edge[i].nxt){
		int to=edge[i].to;
		if(i==(fa^1)) continue;
		if(!dfn[to]){
			tarjan(to,i);
			low[u]=min(low[u],low[to]);
		}
		else{
			low[u]=min(low[u],dfn[to]);
		}
	}
	if(dfn[u]==low[u]){
		cnt++;
		int t;
		do{
			t=st.top();
			st.pop();
			scc[cnt].push_back(t);
		}while(t!=u);
	}
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	memset(head,-1,sizeof head);
	cin>>n>>m;
	int ui,vi;
	for(int i=1;i<=m;i++){
		cin>>ui>>vi;
		add(ui,vi,i*2);
		add(vi,ui,i*2+1);
	}
	tot=0;
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i,-1);
		}
	}
	cout<<cnt<<endl;
	for(int i=1;i<=cnt;i++){
		int len=scc[i].size();
		cout<<len<<" ";
		for(int j=0;j<len;j++){
			cout<<scc[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
} 
2025/1/19 21:39
加载中...