重边怎么处理? 附上25pts代码(加上RE的点50pts)
#include<bits/stdc++.h>
using namespace std;
int n,m,ut,vt,wt,dfn[1000010],low[1000010],cnt,cntbcc;
vector<int> g[1000010];
vector<int> bcc[1000010];
stack<int> s;
void tarjan(int u,int fa) {
dfn[u] = low[u] = ++cnt;
s.push(u);
for (int i = 0;i < g[u].size();i ++) {
int v = g[u][i];
if (!dfn[v]) {
tarjan(v,u);
low[u] = min(low[u],low[v]);
//if (low[v] > dfn[u]) bridge.push_back(make_pair(u,v));//
} else if (v != fa) low[u] = min(low[u],dfn[v]);
}
if (low[u] == dfn[u]) {
++ cntbcc;
while (s.top() != u) {
bcc[cntbcc].push_back(s.top());
s.pop();
}
bcc[cntbcc].push_back(s.top());
s.pop();
}
return;
}
int main() {
scanf("%d%d",&n,&m);
for (int i = 1;i <= m;i ++) {
scanf("%d%d",&ut,&vt);
g[ut].push_back(vt);
g[vt].push_back(ut);
}
for (int i = 1;i <= n;i ++)
if (!dfn[i]) tarjan(i,0);
printf("%d\n",cntbcc);
for (int i = 1;i <= cntbcc;i ++) {
printf("%d ",bcc[i].size());
for (int j = 0;j < bcc[i].size();j ++)
printf("%d ",bcc[i][j]);
printf("\n");
}
return 0;
}