上白泽慧音

    xiaoxiao2021-03-25  108

    QAQ 就是个很简单的tarjan啊?

    #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int head[5001],net[200000],to[200000]; int cnt; void add(int x,int y) { cnt++; to[cnt]=y; net[cnt]=head[x]; head[x]=cnt; } int color[5001],c,num,low[5001],dfn[5001],top,f[5001],s[5001]; int sum[5001]; void dfs(int x) { dfn[x]=++num; low[x]=num; f[x]=1; s[++top]=x; for(int i=head[x];i;i=net[i]) { int tmp=to[i]; if(dfn[tmp]==0) { dfs(tmp); low[x]=min(low[x],low[tmp]); } else if(f[tmp]==1) { low[x]=min(low[x],dfn[tmp]); } } if(low[x]==dfn[x]) { f[x]=0; color[x]=++c; int tot=1; while(s[top]!=x) { color[s[top]]=c; f[s[top]]=0; top--; tot++; } top--; sum[c]=tot; } } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y,t; scanf("%d%d%d",&x,&y,&t); add(x,y); if(t==2) add(y,x); } for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i); int k=0; sum[0]=-1; for(int i=1;i<=c;i++) { if(sum[i]>sum[k]) k=i; } printf("%d\n",sum[k]); for(int i=1;i<=n;i++) if(color[i]==k) printf("%d ",i); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-21684.html

    最新回复(0)