這個題目名……感覺……很……
很裸的一個tarjan吧……
不說了,上代碼(代碼是誰)
#include <bits/stdc++.h>
using namespace std;
vector <int> que[51000];
int tim,ans,stc[51000],ps,out[51000],flag,dfn[51000],low[51000],clr[51000],ins[51000],top,color_num,count=0,maxn,rem,an[51000];
void tarjan(int x)
{
tim++;
dfn[x]=tim;
low[x]=tim;
ins[x]=1;
stc[++top]=x;
for(int i=0;i<que[x].size();i++)
{
int tmp=que[x][i];
if(dfn[tmp]==0)
{
tarjan(tmp);
low[x]=min(low[x],low[tmp]);
}
else if(ins[tmp]) low[x]=min(low[x],low[tmp]);
}
if(dfn[x]==low[x])
{
if(stc[top]==x)
ps++;
flag=1;
ins[x]=0;
clr[x]=++color_num;
while(stc[top]!=x)
{
flag++;
clr[stc[top]]=color_num;
ins[stc[top]]=0;
top--;
}
if(flag>maxn)
maxn=flag,rem=color_num;
top--;
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,t;
cin>>x>>y>>t;
if(t==1)
{
que[x].push_back(y);
}
else
{
que[x].push_back(y);
que[y].push_back(x);
}
}
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
cout<<maxn<<endl;
for(int i=1;i<=n;i++)
if(clr[i]==rem) printf("%d ",i);
return 0;
}
其實寫的過程中沒出什麼錯,就是……“tm”居然是關鍵字……