生活随笔
收集整理的這篇文章主要介紹了
bzoj 2109: [Noi2010]Plane 航空管制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
世博期間,上海的航空客運量大大超過了平時,隨之而來的航空管制也頻頻 發生。最近,小X就因為航空管制,連續兩次在機場被延誤超過了兩小時。對此, 小X表示很不滿意。 在這次來煙臺的路上,小 X不幸又一次碰上了航空管制。于是小 X開始思考 關于航空管制的問題。 假設目前被延誤航班共有 n個,編號為 1至n。機場只有一條起飛跑道,所 有的航班需按某個順序依次起飛(稱這個順序為起飛序列)。定義一個航班的起 飛序號為該航班在起飛序列中的位置,即是第幾個起飛的航班。 起飛序列還存在兩類限制條件: ? 第一類(最晚起飛時間限制):編號為 i的航班起飛序號不得超過 ki; ? 第二類(相對起飛順序限制):存在一些相對起飛順序限制(a, b),表示 航班 a的起飛時間必須早于航班 b,即航班 a的起飛序號必須小于航班 b 的起飛序號。 小X 思考的第一個問題是,若給定以上兩類限制條件,是否可以計算出一個 可行的起飛序列。第二個問題則是,在考慮兩類限制條件的情況下,如何求出每 個航班在所有可行的起飛序列中的最小起飛序號。
solution
第一問是菜肴制作,建反圖貪心即可.
第二問我們單獨考慮每個飛機,我們強行不管這個飛機,按第一問的做法,拓撲排序,直到隊列空或者出現不能編號的情況為止,這個時候編號能夠比它大的能處理好了,那么這架飛機就只能是這個編號了.
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=2005,M=10005;
int n,m,a[N],num=0,head[N],to[M],nxt[M],du[N],in[N],ret[N];
void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
struct node{int x,v;bool operator <(const node &pr)const{return v<pr.v;}
};
priority_queue<node>q;
void solve1(){for(int i=1;i<=n;i++){in[i]=du[i];if(!in[i])q.push((node){i,a[i]});}int x,cnt=n;while(!q.empty()){x=q.top().x;q.pop();ret[cnt--]=x;for(int i=head[x];i;i=nxt[i]){int u=to[i];in[u]--;if(!in[u])q.push((node){u,a[u]});}}for(int i=1;i<=n;i++)printf("%d ",ret[i]);puts("");
}
inline int solve2(int li){while(!q.empty())q.pop();for(int i=1;i<=n;i++){if(i==li)in[i]=-1;else {in[i]=du[i];if(!in[i])q.push((node){i,a[i]});}}for(int k=n;k>=1;k--){if(q.empty())return k;int x=q.top().x;q.pop();if(k>a[x])return k;for(int i=head[x];i;i=nxt[i]){int u=to[i];in[u]--;if(!in[u])q.push((node){u,a[u]});}}return 1;
}
void work()
{int x,y;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);link(y,x);du[x]++;}solve1();for(int i=1;i<=n;i++)printf("%d ",solve2(i));
}int main()
{work();return 0;
}
轉載于:https://www.cnblogs.com/Yuzao/p/8042563.html
總結
以上是生活随笔為你收集整理的bzoj 2109: [Noi2010]Plane 航空管制的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。