rt,先放出我的代码:
/*
思路:
判断:
起点:入度 = 出度 - 1
终点:出度 = 入度 - 1
普通点: 入度 = 出度
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxm = 200000 + 10;
int n,m,tot,tail = 1;
int ver[maxm],nxt[maxm],head[maxm],ans[maxm],in[maxm],out[maxm],cur[maxm];
int flag[maxm];
struct para{
int x,y;
}p[maxm];
void edge(int a,int b)
{
ver[++tot] = b;
nxt[tot] = head[a];
head[a] = tot;
}
void dfs(int v)
{
for(int i = cur[v] ; i ; i = nxt[i])
{
if(!flag[i])
{
flag[i] = 1;
cur[v] = nxt[i];
dfs(ver[i]);
}
}
ans[++tail] = v;
}
bool cmp(para a,para b)
{
return a.y > b.y || (a.y == b.y && a.x > b.x);
}
int main()
{
// freopen("P7771.in","r",stdin);
// freopen("test.out","w",stdout);
memset(flag,0,sizeof(flag));
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
out[p[i].x]++;
in[p[i].y]++;
}
int st = 0,ed = 0;
sort(p + 1, p + m + 1,cmp);
for(int i = 1; i <= m; i++)
edge(p[i].x,p[i].y);
for(int i = 1; i <= m; i++)
cur[i] = head[i];
for(int i = 1; i <= m; i++)
{
if(in[i] + 1 == out[i])
{
st = i;
continue;
}
if(in[i] - 1 == out[i])
{
ed = i;
continue;
}
if(abs(in[i] - out[i]) > 1)
{
printf("No");
return 0;
}
if(st == 0 && in[i] + 1 == out[i])
{
printf("No");
return 0;
}
if(ed == 0 && in[i] - 1 == out[i])
{
printf("No");
return 0;
}
}
if(st == 0 && ed == 0)
st = 1;
dfs(st);
while(tail > 1)
{
printf("%d ",ans[tail]);
tail--;
}
return 0;
}
顺便说一句我偷懒,把所有数组都开成了
2×105大小,不过应该没关系。
但是十号测试点TLE了:(