一开始是 T 了最后一个点,然后加上了当前弧优化,现在样例都过不了了。求助
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e5+100,M=2e5+100;
int n,m,k,t[N],d1[N],d2[N],st,cnt1,cnt2,s[N],sk;
bool flag[M];
struct edge
{
int u,v;
}e[M];
struct node
{
int id,last;
}a[M];
bool cmp(edge a1,edge a2)
{
return a1.v>a2.v;
}
void add(int a1,int a2)
{
a[++k].id=a2;
a[k].last=t[a1];
t[a1]=k;
}
void dfs(int x)
{
//printf("%d ",x);
for(int i=t[x];i;i=a[i].last)
{
t[x]=a[i].last;
dfs(a[i].id);
}
s[++sk]=x;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&e[i].u,&e[i].v);
d1[e[i].v]++,d2[e[i].u]++;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++) add(e[i].u,e[i].v);
for(int i=1;i<=n;i++)
{
if(d1[i]==d2[i]) continue;
if(d2[i]-d1[i]==1) cnt1++,st=i;
else if(d1[i]-d2[i]==1) cnt2++;
else
{
printf("No");
return 0;
}
}
if(!(!cnt1&&!cnt2||cnt1==1&&cnt2==1))
{
printf("No");
return 0;
}
if(!st) st=1;
dfs(st);
for(int i=sk;i;i--) printf("%d ",s[i]);
return 0;
}