1 条题解

  • 1
    @ 2023-8-15 14:55:51
    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 100010,M = 400010;
    
    int t,n,m;
    int h[N],to[M],ne[M],idx;//链式前向星
    
    bool used[M];
    int ans[M/2],cnt;
    int din[N],dout[N];//入度出度
    //连边 
    inline void add(int u,int v)
    {
    	to[idx] = v;ne[idx] = h[u];h[u] = idx++;	
    } 
    
    void dfs(int u)
    {
    	for(int &i = h[u];~i;)
    	{
    		if(used[i])
    		{
    			i = ne[i];
    			continue;
    		}
    		used[i] = true;
    		if(t == 1) used[i^1] = true;
    		int res;
    		if(t == 1)
    		{
    			res = i/2+1;
    			if(i&1) res = -res;
    		}
    		else res = i+1;
    		int j = to[i];
    		i = ne[i];
    		dfs(j);
    		ans[++cnt] = res;
    	}
    }
    
    int main()
    {
    	cin >> t >> n >> m;
    	memset(h,-1,sizeof(h));
    	for(int i=0;i<m;i++)
    	{
    		int a,b;
    		cin >> a >> b;
    		add(a,b);
    		if(t == 1) add(b,a);
    		din[b]++;dout[a]++;
    	}
    	if(t == 1)
    	{
    		for(int i=1;i<=n;i++)
    		{
    			if(din[i]+dout[i]&1)
    			{
    				cout << "NO";
    				return 0;
    			}
    		}
    	}
    	else
    	{
    		for(int i=1;i<=n;i++)
    		{
    			if(din[i]!=dout[i])
    			{
    				cout << "NO";
    				return 0;
    			}
    		}
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(h[i]!=-1)
    		{
    			dfs(i);
    			break;
    		}
    	}
    	if(cnt<m)
    	{
    		cout << "NO";
    		return 0;
    	}
    	cout << "YES" << endl;
    	if(t==2)
    		for(int i=cnt;i;i--) cout << ans[i] << " ";
    	else
    		for(int i=1;i<=cnt;i++) cout << -ans[i] << " ";
    	return 0;
    }
    
    • 1

    信息

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