链接
题解
倒着贪心,每次把最大的序号给编号最大的出度为 0 0 0的点
可以用反证法证明
而正着搞是错的
代码
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(_,__) for(_=1;_<=(__);_++)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{
ll c, f(1);
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-0x30;
return f*x;
}
struct Graph
{
int etot, head[maxn], to[maxe], next[maxe], w[maxe];
void clear(int N)
{
for(int i=1;i<=N;i++)head[i]=0;
etot=0;
}
void adde(int a, int b, int c=0){to[++etot]=b;w[etot]=c;next[etot]=head[a];head[a]=etot;}
}G;
ll n, m, ans[maxn], f[maxn];
ll indeg[maxn], now;
void bfs()
{
priority_queue<ll> h;
for(ll i=1;i<=n;i++)if(indeg[i]==0)h.em(i);
now=n;
while(!h.empty())
{
auto x=h.top(); h.pop(); ans[x]=now--;
for(auto p=G.head[x];p;p=G.next[p])
{
indeg[G.to[p]]--;
if(indeg[G.to[p]]==0)
h.em(G.to[p]);
}
}
}
int main()
{
ll i, u, v;
n=read(), m=read();
rep(i,m)
{
u=read(), v=read();
G.adde(v,u);
indeg[u]++;
}
bfs();
rep(i,n)printf("%lld ",ans[i]);
return 0;
}