此题我使用堆+拓扑排序直接一发就过了,发现正解是贪心。。。。
好吧
code:
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #define N 200005 5 using namespace std; 6 struct node{ 7 int u,v; 8 }e[N]; 9 int first[N],nxt[N],cnt; 10 void add(int u,int v){ 11 e[++cnt].u=u; 12 e[cnt].v=v; 13 nxt[cnt]=first[u]; 14 first[u]=cnt; 15 } 16 int ru[N],top[N],tot,n,m; 17 void topsort(){ 18 priority_queue<int,vector<int>,greater<int> >q; 19 for(int i=1;i<=n;i++){ 20 if(!ru[i])q.push(i); 21 } 22 while(!q.empty()){ 23 int u=q.top(); 24 top[++tot]=u; 25 q.pop(); 26 for(int i=first[u];i;i=nxt[i]){ 27 int v=e[i].v; 28 ru[v]--; 29 if(!ru[v]){ 30 q.push(v); 31 } 32 } 33 } 34 } 35 int a[N]; 36 int main(){ 37 freopen("patrol.in","r",stdin); 38 freopen("patrol.out","w",stdout); 39 cin>>n>>m; 40 for(int i=1;i<=m;i++)cin>>a[i]; 41 for(int i=2;i<=m;i++){ 42 ru[a[i]]++; 43 add(a[i-1],a[i]); 44 } 45 topsort(); 46 for(int i=1;i<=tot;i++){ 47 cout<<top[i]<<' '; 48 } 49 return 0; 50 }
over