1 条题解
-
0
#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
- 上传者