2 条题解

  • 0
    @ 2025-10-8 16:59:11

    20241219尝试教的新代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e4+10;
    vector<pair<int,int>>G[N];
    int id,cnt,dfn[N],low[N],dcc[N],cut[N],root;
    
    void tarjan(int x,int in_id)
    {
    	dfn[x]=low[x]=++id;
    	int child=0;
    	for(auto i:G[x])if(i.second!=in_id)
    	{
            int y=i.first,id=i.second;
    		if(dfn[y]==0)
    		{
    			tarjan(y,id);
    			low[x]=min(low[x],low[y]);
    			if(dfn[x]<=low[y])
    			{
    				child++;
    				if(x!=root || child>1)cut[x]++;
    			}
    		}
    		else low[x]=min(low[x],dfn[y]);
    	}
    }
    int d[N];
    int main()
    {
    	int n,m;
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		if(n==0&&m==0) break;
    		memset(G,0,sizeof(G));
    		memset(d,0,sizeof(d));
    		for(int i=1,x,y;i<=m;i++)
    		{
    			scanf("%d%d",&x,&y);x++,y++;
    			d[x]++;d[y]++;
    			G[x].push_back({y,i});G[y].push_back({x,i});
    		}
    		id=cnt=0;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
    		memset(cut,0,sizeof(cut));
    		int cnt=0;
    		for(int i=1;i<=n;i++)if(dfn[i]==0)cnt++,root=i,tarjan(i,0);
    		
    		int ans=0;
    		for(int i=1;i<=n;i++)
    			if(d[i]==0)ans=max(ans,cnt-1);
    			else  ans=max(ans,cnt+cut[i]);
    		printf("%d\n",ans);
    	}
        return 0;
    }
    

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e4+10;
    vector<int>G[N];
    int id,cnt,dfn[N],low[N],dcc[N],cut[N],root;
    
    void tarjan(int x)
    {
    	dfn[x]=low[x]=++id;
    	int child=0;
    	for(int y:G[x])
    	{
    
    		if( dfn[y]==0)
    		{
    			tarjan(y);
    			low[x]=min(low[x],low[y]);
    			if(dfn[x]<=low[y])
    			{
    				child++;
    				if(x!=root || child>1)cut[x]++;
    			}
    		}
    		else low[x]=min(low[x],dfn[y]);
    	}
    }
    int d[N];
    int main()
    {
    	int n,m;
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		if(n==0&&m==0) break;
    		memset(G,0,sizeof(G));
    		memset(d,0,sizeof(d));
    		for(int i=1,x,y;i<=m;i++)
    		{
    			scanf("%d%d",&x,&y);x++,y++;
    			d[x]++;d[y]++;
    			G[x].push_back(y);G[y].push_back(x);
    		}
    		id=cnt=0;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
    		memset(cut,0,sizeof(cut));
    		int cnt=0;
    		for(int i=1;i<=n;i++)if(dfn[i]==0)cnt++,root=i,tarjan(i);
    		
    		int ans=0;
    		for(int i=1;i<=n;i++)
    			if(d[i]==0)ans=max(ans,cnt-1);
    			else  ans=max(ans,cnt+cut[i]);
    		printf("%d\n",ans);
    	}
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:58:54

      20241219尝试教的新代码:

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e4+10;
      vector<pair<int,int>>G[N];
      int id,cnt,dfn[N],low[N],dcc[N],cut[N],root;
      
      void tarjan(int x,int in_id)
      {
      	dfn[x]=low[x]=++id;
      	int child=0;
      	for(auto i:G[x])if(i.second!=in_id)
      	{
              int y=i.first,id=i.second;
      		if(dfn[y]==0)
      		{
      			tarjan(y,id);
      			low[x]=min(low[x],low[y]);
      			if(dfn[x]<=low[y])
      			{
      				child++;
      				if(x!=root || child>1)cut[x]++;
      			}
      		}
      		else low[x]=min(low[x],dfn[y]);
      	}
      }
      int d[N];
      int main()
      {
      	int n,m;
      	while(scanf("%d%d",&n,&m)!=EOF)
      	{
      		if(n==0&&m==0) break;
      		memset(G,0,sizeof(G));
      		memset(d,0,sizeof(d));
      		for(int i=1,x,y;i<=m;i++)
      		{
      			scanf("%d%d",&x,&y);x++,y++;
      			d[x]++;d[y]++;
      			G[x].push_back({y,i});G[y].push_back({x,i});
      		}
      		id=cnt=0;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
      		memset(cut,0,sizeof(cut));
      		int cnt=0;
      		for(int i=1;i<=n;i++)if(dfn[i]==0)cnt++,root=i,tarjan(i,0);
      		
      		int ans=0;
      		for(int i=1;i<=n;i++)
      			if(d[i]==0)ans=max(ans,cnt-1);
      			else  ans=max(ans,cnt+cut[i]);
      		printf("%d\n",ans);
      	}
          return 0;
      }

      代码:
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e4+10;
      vector<int>G[N];
      int id,cnt,dfn[N],low[N],dcc[N],cut[N],root;
      

      void tarjan(int x) { dfn[x]=low[x]=++id; int child=0; for(int y:G[x]) {

      	if( dfn[y]==0)
      	{
      		tarjan(y);
      		low[x]=min(low[x]&#44;low[y]);
      		if(dfn[x]&lt;=low[y])
      		{
      			child++;
      			if(x!=root || child&gt;1)cut[x]++;
      		}
      	}
      	else low[x]=min(low[x]&#44;dfn[y]);
      }
      

      } int d[N]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(n0&&m0) break; memset(G,0,sizeof(G)); memset(d,0,sizeof(d)); for(int i=1,x,y;i<=m;i++) { scanf("%d%d",&x,&y);x++,y++; d[x]++;d[y]++; G[x].push_back(y);G[y].push_back(x); } id=cnt=0;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low)); memset(cut,0,sizeof(cut)); int cnt=0; for(int i=1;i<=n;i++)if(dfn[i]==0)cnt++,root=i,tarjan(i);

      	int ans=0;
      	for(int i=1;i&lt;=n;i++)
      		if(d[i]==0)ans=max(ans&#44;cnt-1);
      		else  ans=max(ans&#44;cnt+cut[i]);
      	printf("%d\n"&#44;ans);
      }
      return 0;
      

      }

      </p>
      • 1

      *【割点】求删点后连通块的数目[CTUOpen2004]电力

      信息

      ID
      1885
      时间
      5000ms
      内存
      512MiB
      难度
      8
      标签
      递交数
      86
      已通过
      14
      上传者