用的堆排序,有两个点过不去
#include<bits/stdc++.h>
#define maxn 5005
#define maxm 50005
using namespace std;
int n,m,ans[maxn][maxn];
int num,head[5005];
struct node{
int nex,to;
};
node e[10005];
void add(int fr,int t)
{
e[++num].to=t;
e[num].nex=head[fr];
head[fr]=num;
}
int dfn[maxn],low[maxn],dfs_num,stak[maxn],top,vis[maxn],color[maxn];
void tarjan(int x)
{
dfn[x]=low[x]=++dfs_num;
stak[++top]=x;
vis[x]=1;
for(int i=head[x];i;i=e[i].nex)
{
int j=e[i].to;
if(!dfn[j]){
tarjan(j);
low[x]=min(low[x],low[j]);
}
if(vis[j]){
low[x]=min(low[x],dfn[j]);
}
}
if(dfn[x]==low[x])
{
vis[x]=0;
while(stak[top]!=x)
{
vis[stak[top]]=0;
ans[low[x]][++ans[low[x]][0]]=stak[top--];
}
ans[low[x]][++ans[low[x]][0]]=stak[top--];
}
}
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
cin>>n>>m;
for(int i=1,a,b,c;i<=m;i++)
{
cin>>a>>b>>c;
switch(c)
{
case 2:add(b,a);add(a,b);break;
case 1:add(a,b);
}
}
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
int max_=0,j;
for(int i=1;i<=n;i++)
{
if(!ans[i][0])continue;
else if(ans[i][0]>max_){
max_=ans[i][0];
j=i;
}
}
for(int i=1;i<=ans[j][0];i++)
{
q.push(ans[j][i]);
}
cout<<ans[j][0]<<endl;
while(!q.empty())
{
cout<<q.top()<<' ';
q.pop();
}
return 0;
}