2 条题解

  • 1
    @ 2025-12-7 15:42:09
    #include<bits/stdc++.h>
    using namespace std;
    const int N=5e5+10;
    vector<int>G[N],G2[N];
    int dfn[N],low[N],scc[N],tsp,cnt,siz[N];
    stack<int>stk;bool instk[N];
    void tarjan(int x)
    {
    	dfn[x]=low[x]=++tsp;
    	stk.push(x);instk[x]=1;
    	for(int y:G[x])
    	{
    		if(!dfn[y])
    		{
    			tarjan(y);
    			low[x]=min(low[x],low[y]);
    		}
    		else if(instk[y])low[x]=min(low[x],dfn[y]);
    	}
    	if(dfn[x]==low[x])
    	{
    		cnt++;
    		int z=-1;
    		while(z!=x)
    		{
    			z=stk.top(),stk.pop(),instk[z]=0;
    			scc[z]=cnt;siz[cnt]++;G2[cnt].push_back(z);
    		}
    	}
    }
    int main()
    {
    	int n,m;cin>>n>>m;
    	for(int i=1;i<=m;i++)
    	{
    		int x,y;cin>>x>>y;x++,y++;
    		G[x].push_back(y);
    	}
    	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
    	cout<<cnt<<'\n';
    	for(int i=cnt;i>=1;i--)
    	{
    		cout<<siz[i]<<' ';
    		for(int y:G2[i])cout<<y-1<<' ';
    		cout<<'\n';
    	}
    	return 0;
    }
    
    • 0
      @ 2026-8-5 11:23:39
      #include<bits/stdc++.h>
      using namespace std;
      const int N = 5e5 + 10;
      int dfn[N], low[N], scc[N], tsp = 0, cnt = 0, siz[N];
      vector<int> G[N], ring[N];
      stack<int> stk; bool instk[N];
      
      void tarjan(int x)
      {
          dfn[x] = low[x] = ++tsp;
          stk.push(x); instk[x] = 1;
          for (auto y : G[x])
          {
              if (!dfn[y])
              {
                  tarjan(y);
                  low[x] = min(low[x], low[y]);
              }
              else if (instk[y]) low[x] = min(low[x], dfn[y]);
          }
          if (low[x] == dfn[x])
          {
              cnt ++;
              int z = -1;
              while (z != x)
              {
                  z = stk.top(); stk.pop(); instk[z] = 0;
                  scc[z] = cnt; siz[cnt] ++;
                  ring[cnt].push_back(z);
              }
          }
      }
      
      int main()
      {
          int n, m; cin >> n >> m;
          for (int i = 1; i <= m; i++)
          {
              int x, y; cin >> x >> y;
              x ++; y ++;
              G[x].push_back(y);
          }
          for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i);
          cout << cnt << '\n';
          for (int i = cnt; i >= 1; i--)
          {
              cout << siz[i] << ' ';
              for (auto j : ring[i]) cout << j - 1 << ' ';
              cout << endl;
          }
          return 0;
      }
      
      • 1

      强连通分量(Strongly Connected Components)

      信息

      ID
      8162
      时间
      500ms
      内存
      1024MiB
      难度
      6
      标签
      递交数
      35
      已通过
      11
      上传者