最后两点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;
}