缩点的模板。
因为数据范围很小,所以对于输出方案的判断就可以很水。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>line[5010];
int dfn[5010],low[5010],tim;
int belong[5010],cnt;
int num[5010],Max;
int stack[100000],top;
bool insta[5010];
int n,m;
void tarjan(int now)
{
dfn[now]=low[now]=++tim;
stack[++top]=now;
insta[now]=true;
for(int i=0;i<line[now].size();i++)
{
int nxt=line[now][i];
if(!dfn[nxt])
{
tarjan(nxt);
if(low[nxt]<low[now])
low[now]=low[nxt];
}
else
if(insta[nxt]&&dfn[nxt]<low[now])
low[now]=dfn[nxt];
}
if(dfn[now]==low[now])
{
int c=0;
cnt+=1;
int pas;
do
{
pas=stack[top--];
insta[pas]=false;
belong[pas]=cnt;
c+=1;
}while(pas!=now);
num[cnt]=c;
if(!Max)
{
Max=cnt;
return ;
}
if(num[Max]==num[cnt])
{
for(int i=1;i<=n;i++)
{
if(belong[i]==Max)
return ;
if(belong[i]==cnt)
{
Max=cnt;
return;
}
}
}
if(num[Max]<num[cnt])
{
Max=cnt;
return;
}
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
int a,b,t;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&t);
if(t==1)
line[a].push_back(b);
else
line[a].push_back(b),line[b].push_back(a);
}
for(int i=1;i<=n;i++)
if(!belong[i])
tarjan(i);
printf("%d
",num[Max]);
for(int i=1;i<=n;i++)
if(belong[i]==Max)
printf("%d ",i);
return 0;
}