#include<bits/stdc++.h>
using namespace std;
const int N=5e3+7;
vector<int> G[N];
int n,m;
int dfn[N],low[N],tot,sta[N],siz,insta[N];
struct node{
int sz,fist;
priority_queue<int> q;
}g[N];
int scc;
void tarjan(int u){
dfn[u]=low[u]=++tot;
insta[u]=1,sta[++siz]=u;
for(int v:G[u]){
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(insta[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
node lin;
lin.fist=sta[siz];
int cnt=0,y;
do{
y=sta[siz--];
lin.q.push(-y);
insta[y]=0;
cnt++;
}while(y!=u);
lin.sz=cnt;
g[++scc]=lin;
}
}
bool cmp(node x,node y){
if(x.sz==y.sz) return x.fist<y.fist;
return x.sz>y.sz;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1,u,v,op;i<=m;i++){
cin>>u>>v>>op;
G[u].push_back(v);
if(op==2) G[v].push_back(u);
}
for(int i=1;i<=n;i++){
if(!dfn[N]) tarjan(i);
}
sort(g+1,g+1+scc,cmp);
cout<<g[1].sz<<'\n';
while(!g[1].q.empty()){
cout<<(-g[1].q.top())<<' ';
g[1].q.pop();
}
return 0;
}
第一组数据:
10 10
5 3 1
6 8 2
5 7 2
1 10 1
4 9 1
7 3 2
8 8 1
3 1 1
9 7 2
7 8 2
代码在本地可以输出正确答案。