Topology ordering.
Reverse-build edges.
In order to make the small number as far as possible in front, we have to take out the maximum point in degrees 0 each time.
#include <stdio.h> #include <algorithm> #include <iostream> #include <stdlib.h> #include < vector> #include <queue> #include <string.h> #include <math.h>using namespace std;struct list{int u , V,w; int next;} Edge[110000];int head[33000];int nums;void Add (int u,int v,int W) {edge[nums].u=u; Edge[nums].v=v; Edge[nums].w=w; Edge[nums].next=head[u]; head[u]=nums++;} int du[33000];void init () {memset (head,-1,sizeof (head)); Nums=1; memset (du,0,sizeof (du));} Priority_queue<int>que;vector<int>vec;int n;void dos () {vec.clear (); while (!que.empty ()) Que.pop (); for (int i=1;i<=n;i++) {if (du[i]==0) Que.push (i); } while (!que.empty ()) {int x=que.top (); Que.pop (); for (int i=head[x];i!=-1;i=edge[i].next) {int y=edge[i].v; du[y]--; if (du[y]==0) {Que.push (y); }} vec.push_back (x); } for (int i=n-1;i>=0;i--) {if (i!=n-1) printf (""); printf ("%d", vec[i]); } Cout<<endl;} int main () {int t,m,a,b; scanf ("%d", &t); while (t--) {init (); scanf ("%d%d", &n,&m); for (int i=1;i<=m;i++) {scanf ("%d%d", &a,&b); Add (b,a,1); du[a]++; } dos (); } return 0;}
hdu-4857-Escape-Topology sort