1. 程式人生 > 遊戲 >Steam全球願望單排名 《消逝的光芒2》排名第一

Steam全球願望單排名 《消逝的光芒2》排名第一

簡介: 有很多工是按照先後順序完成的,必須把前面的所有任務完成,才可以做下一個任務。

利用 入讀 來表示前面還有多少個任務沒有完成,當入度為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; }
拓撲排序

栗子: