基本上算是强;连通分量的板子题吧,只需要对最后的拓扑序稍微的操作一下就行了,
下面给出代码。
#include<bits/stdc++.h>
using namespace std;
#define met(Q,QQ) memset(Q,QQ,sizeof(Q))
const int maxn=5007;
vector<int > G[maxn];
vector< int > rG[maxn];
vector< int > vec;
bool vis[maxn];
int cmp[maxn];
int n,m;
int a[maxn];
void add_edge(int from,int to)
{
G[from].push_back(to);
rG[to].push_back(from);
}
void dfs(int k)
{
vis[k]=true;
int kk=G[k].size();
for(int i=0;i<kk;i++)
{
int kkk=G[k][i];
if(!vis[kkk]) dfs(kkk);
}
vec.push_back(k);
}
void rdfs(int k,int cnt)
{
vis[k]=true;
cmp[k]=cnt;
int kk=rG[k].size();
for(int i=0;i<kk;i++)
{
int kkk=rG[k][i];
if(!vis[kkk]) rdfs(kkk,cnt);
}
}
int main()
{
scanf("%d %d",&n,&m);
int t,from,to;
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&from,&to,&t);
add_edge(from,to);
if(t==2) add_edge(to,from);
}
met(vis,0);
for(int i=1;i<=n;i++)
{
if(!vis[i]) dfs(i);
}
met(vis,0);
int cnt=0;
int kk=vec.size();
for(int i=kk-1;i>=0;i--)
{
int kkk=vec[i];
if(!vis[kkk])
{
cnt++;
rdfs(kkk,cnt);
}
}
met(a,0);
for(int i=1;i<=n;i++)
{
a[cmp[i]]++;
}
int MAX=-1,B=0;
for(int i=1;i<=cnt;i++)
{
if(a[i]>MAX)
{
MAX=a[i];
}
}
printf("%d\n",MAX);
int AA=0;
for(int i=1;i<=n;i++)
{
if(a[cmp[i]]==MAX)
{
B=cmp[i];
}
if(cmp[i]==B)
{
if(AA)
{
printf(" %d",i);
}
else
{
printf("%d",i);
AA=1;
}
}
}
return 0;
}