1 条题解

  • 0
    @ 2025-10-8 16:50:31
    #include<bits/stdc++.h>
    using namespace std;
    const int N=510,M=1e5+10;
    struct edge{int x,y,next;}a[M];int alen,first[N],last[N];
    void ins(int x,int y)
    {
    	++alen;a[alen]=edge{x,y,0};
    	a[last[x]].next=alen;
    	if(first[x]==0)first[x]=alen;//引入first数组解决遍历先来先遍历,是重要技巧
    	last[x]=alen;
    }
    
    int b[M],bn,rd[N],cd[N];
    void oula(int x)
    {
        for(int k=first[x];k;k=first[x])
        {
            first[x]=a[k].next;//下来访问x的时候接着没访问过的下一条边 
    		oula(a[k].y);
    		b[++bn]=k;
        }
    }
    
    int main()
    {
        int n,m;scanf("%d%d",&n,&m);
        alen=0;memset(last,0,sizeof(last));memset(first,0,sizeof(first));
        for(int i=1,x,y;i<=m;i++)
    	{
    		scanf("%d%d",&x,&y);
    		ins(x,y);
    		rd[y]++;cd[x]++;
    	}
        
        int st=1,ed,t1=0,t2=0;
        for(int i=1;i<=n;i++)
        {
        	if( abs(cd[i]-rd[i]) >1 ){printf("NO\n");return 0;}
            if(cd[i]-rd[i]==1){st=i;t1++;}
            if(rd[i]-cd[i]==1){ed=i;t2++;}
        }
        if(!( (t1==0 && t2==0)||(t1==1 && t2==1) )){printf("NO\n");return 0;}
    	//(t1==0 && t2==0)表示存在欧拉回路(欧拉图), (t1==1 && t2==1)表示存在欧拉路径(半欧拉图) 
        
        bn=0;oula(st);
        
        if(bn!=m)printf("NO\n");
    	else for(int i=m;i>=1;i--)printf("%d ",b[i]);
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    453
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    128
    已通过
    27
    上传者