超裸Tarjan求點數最多的強連通分量 我這個蒟蒻都覺得沒啥好寫了 複習闆子用
傳送門
/*
作者:ymzQwQ
題目:p1332 上白澤慧音
*/
#include<iostream>
#include<cstdio>
#include<stack>
#include<vector>
using namespace std;
const int N=,M=;
int n,m,x,y,z,color[N],ans,sum[N],num,dfn[N],low[N],clonow;
bool b[N];
vector<int> a[N];
stack<int> h;
int Min(int x,int y) { return x<y?x:y; }
void tarjan(int x){
dfn[x]=++num;low[x]=num;b[x]=;h.push(x);
for(int i=;i<=a[x][];i++){
int temp=a[x][i];
if (!dfn[temp]) tarjan(temp),low[x]=Min(low[x],low[temp]);
else if (b[temp]) low[x]=Min(low[x],low[temp]);
}
if (dfn[x]==low[x]){
b[x]=;color[x]=++clonow;sum[clonow]++;
while(h.top()!=x){
int temp=h.top();
b[temp]=;color[temp]=clonow;
h.pop();sum[clonow]++;
}
h.pop();
if (sum[clonow]>sum[ans]) ans=clonow;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) a[i].push_back();
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
a[x].push_back(y);++a[x][];
if (z==) a[y].push_back(x),++a[y][];
}
for(int i=;i<=n;i++) if (!dfn[i]) tarjan(i);
printf("%d\n",sum[ans]);
for(int i=;i<=n;i++) if (color[i]==ans) printf("%d ",i);
return ;
}