1 条题解

  • 0
    @ 2022-4-27 19:35:06

    以下仅供参考

    #include<bits/stdc++.h>
    #define pb push_back
    #define MaxN 10500
    using namespace std;
    vector<int>g[MaxN],p[MaxN];
    int cnt;int s[MaxN];int sp;int ans[MaxN];int tn;
    bool dis[MaxN];bool vis[MaxN];bool e[MaxN];
    void pfs(int u)
    {
    	vis[u]=1;
    	for (int i=0,v;i<g[u].size();i++)
    	if (!vis[v=g[u][i]])
    	{
    	    dis[v]=dis[u]^1;
    	    e[p[u][i]]=1;
    	    pfs(v);
    	}
    	else if(!e[p[u][i]])
    	{
    	    e[p[u][i]]=1;
    	    if (dis[u]==dis[v])
    		{
    	    	cnt++;s[u]++;s[v]--;
    	        sp=p[u][i];
    	    }
    		else
    		{
    			s[u]--;
    			s[v]++;
    		}
    	}
    }
    void dfs(int u)
    {
      	vis[u]=1;
      	for (int i=0,v;i<g[u].size();i++)
        if(!vis[v=g[u][i]])
    	{
            dfs(v);
            if (s[v]==cnt)ans[++tn]=p[u][i];
            s[u]+=s[v];
        }
    }
    int n,m;
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1,u,v;i<=m;i++)
        {
        	scanf("%d%d",&u,&v);
        	g[u].pb(v);
    		p[u].pb(i);
        	g[v].pb(u);
    		p[v].pb(i);
        }
        for (int i=1;i<=n;i++)
        {
        	if (!vis[i])pfs(i);
    	}	
        if (!cnt)
    	{
            printf("%d\n",m);
            for (int i=1;i<=m;i++)
            {
            	printf("%d ",i);	
    		}
        return 0;
       }
       for(int i=1;i<=n;i++)vis[i]=0;
       for(int i=1;i<=n;i++)
       {
    		if(!vis[i])dfs(i);
       } 
       if(cnt==1) ans[++tn]=sp;
       printf("%d\n",tn);
       sort(ans+1,ans+tn+1);
       for (int i=1;i<=tn;i++)
       {
       		printf("%d ",ans[i]);
       } 
    	return 0;
    }
    
    • 1

    信息

    ID
    7014
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    3
    上传者