逃生(拓撲排序)

2022-09-06 22:48:29 字數 1491 閱讀 1569

題目鏈結

題意:n個人編號1-n,有m種限制關係,u、v表示u必須在v前面,編號小盡量放前面。給出編號順序。

解法:建立乙個反圖,跑一邊字典序最大的拓撲排序,最後再把這個排序倒過來就是答案了。

參考部落格

#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll ;

#define int ll

#define mod 10000

#define gcd __gcd

#define rep(i , j , n) for(int i = j ; i <= n ; i++)

#define red(i , n , j) for(int i = n ; i >= j ; i--)

#define me(x , y) memset(x , y , sizeof(x))

//int lcm(int a , int b)

//ll quickpow(ll a , ll b)return ans;}

//int euler1(int x)if(x>1)ans-=ans/x;return ans;}

//const int n = 1e7+9; int vis[n],prime[n],phi[n];int euler2(int n)for(int j=1;j#define fi first

#define se second

#define lson l,mid,root<<1

#define rson mid+1,r,root<<1|1

#define pb push_back

#define mp make_pair

#define all(v) v.begin(),v.end()

#define size(v) (int)(v.size())

#define cin(x) scanf("%lld" , &x);

const int n = 11;

const int maxn = 3e4+9;

const double esp = 1e-6;

int in[maxn] , n, m;

vectorg[maxn];

void init()

}void tuopu()

}while(!q.empty())}}

for(int i = size(ans)-1 ; i > 0 ; i--)

cout << ans[i] << " ";

cout << ans[0] << endl;

}void solve()

tuopu();

}signed main()

逃生(拓撲排序,反向)

糟糕的事情發生啦,現在大家都忙著逃命。但是逃命的通道很窄,大家只能排成一行。現在有n個人,從1標號到n。同時有一些奇怪的約束條件,每個都形如 a必須在b之前。同時,社會是不平等的,這些人有的窮有的富。1號最富,2號第二富,以此類推。有錢人就賄賂負責人,所以他們有一些好處。負責人現在可以安排大家排隊的...

HDU 4857 逃生 拓撲排序

time limit 1000ms memory limit 32768kb 64bit io format i64d i64udescription 糟糕的事情發生啦,現在大家都忙著逃命。但是逃命的通道很窄,大家只能排成一行。現在有n個人,從1標號到n。同時有一些奇怪的約束條件,每個都形如 a必須...

HDU 4857 逃生 (拓撲排序)

糟糕的事情發生啦,現在大家都忙著逃命。但是逃命的通道很窄,大家只能排成一行。現在有n個人,從1標號到n。同時有一些奇怪的約束條件,每個都形如 a必須在b之前。同時,社會是不平等的,這些人有的窮有的富。1號最富,2號第二富,以此類推。有錢人就賄賂負責人,所以他們有一些好處。負責人現在可以安排大家排隊的...