听灌多
  • 板块灌水区
  • 楼主0tAp
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/5/14 20:38
  • 上次更新2024/5/14 22:16:24
查看原帖
听灌多
758858
0tAp楼主2024/5/14 20:38
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
const int N=5e3+10,M=1e5+10;

int n,m;
int h[N],e[M],ne[M];
int dfn[N],low[N],c[N];
bool inc[N];
int idx=0,cnt=0,num=0;
stack<int>stk;
priority_queue<int,vector<int>,greater<int> >scc[N];

struct point{
    int siz=0,id,dictionary;
}p[N];

void add(int a,int b)
{
    e[++idx]=b,ne[idx]=h[a],h[a]=idx;
}

bool cmp(point a,point b)
{
    (a.siz==b.siz)?(a.dictionary<b.dictionary):a.siz>b.siz;
}

void tarjan(int x)
{
    dfn[x]=low[x]=++num;
    stk.push(x);
    inc[x]=true;
    for(int i=h[x];i;i=ne[i]){
        int y=e[i];
        if(!dfn[y]){
            tarjan(y);
            low[x]=min(low[x],low[y]);
        }
        else if(inc[y])low[x]=min(low[x],dfn[y]);
    }
    if(dfn[x]==low[x])
    {
        cnt++;
        int y;
        p[cnt].dictionary=stk.top();
        do{
            y=stk.top();
            stk.pop();
            inc[y]=false;
            c[y]=cnt;
            p[cnt].id=cnt;
            p[cnt].siz++;
            scc[cnt].push(y);
        }while(x!=y);
    }
}

int main() {
    cin>>n>>m;
    rep(i,1,m) {
        int a, b, t;
        cin>>a>>b>>t;
        add(a, b);
        if (t==2)add(b, a);
    }
    memset(dfn,0,sizeof dfn);
    memset(inc,0,sizeof inc);
    rep(i,1,n)
        if(!dfn[i])
            tarjan(i);
    sort(p+1,p+1+cnt,cmp);
    cout<<p[1].siz<<endl;
    while(!scc[p[1].id].empty())
    {
        cout<<scc[p[1].id].top()<<" ";
        scc[p[1].id].pop();
    }
    return 0;
}

佬们,求助一下,这段代码为啥re啊

2024/5/14 20:38
加载中...