Steam全球願望單排名 《消逝的光芒2》排名第一
阿新 • • 發佈:2021-10-12
簡介: 有很多工是按照先後順序完成的,必須把前面的所有任務完成,才可以做下一個任務。
利用 入讀 來表示前面還有多少個任務沒有完成,當入度為0,就完成這個任務。
小工具: 優先佇列。(優先佇列不是動態的,是把每次加入的元素當成一個單獨的東西)
程式碼:
#include <bits/stdc++.h> using namespace std; #define M 100005 #define ri register int int n,m; int du[M]; vector <int> p[M]; struct cmp{ bool operator ()(const拓撲排序int &a,const int &b)const { return a>b; } }; priority_queue <int,vector<int>,cmp> q; int num,ot[M],trmp; void ybh() { while(!q.empty()) { int a=q.top(); q.pop(); num++; ot[++trmp]=a; for(ri i=0;i<p[a].size();i++) { du[p[a][i]]--; if(!du[p[a][i]]) q.push(p[a][i]); } } } int main(){ scanf("%d%d",&n,&m); for(ri i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); p[a].push_back(b); du[b]++; } for(ri i=1;i<=n;i++) {if(!du[i]) q.push(i); } ybh(); if(num==n) { for(ri i=1;i<=n;i++) { printf("%d ",ot[i]); } } else { printf("no solution"); } return 0; }
栗子: