【Luogu】 P1726 上白澤慧音

這個題目名……感覺……很……
很裸的一個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”居然是關鍵字……

發佈了51 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章