首先第一問是很好做的,因為題目中保證有合法解,所以我們盡量讓期限晚的航班晚起飛.
所以就是反著建圖,按照拓撲序給每個航班安排時間.
第二問要求問所有合法解中每個航班最早什麼時候能起飛.
那麼還是參考第一問的思路,額外的一點就是讓能安排在它後面的航班都安排到後面.所以就是先限制不選它,直到剩下的沒有辦法再選擇的時候,給它賦上當前的拓撲序.
#include#include#include#include#include#include#define maxn 2010
using namespace std;
int n,m,t,dfn_clock;
int head[maxn],ru[maxn],ans1[maxn],ans2[maxn];
int tim[maxn],cur[maxn],kkk[maxn],p[maxn];
struct node
); while(!q.empty()));}
}}inline void solve2(int x)
); if(q.empty())
while(!q.empty()));}
}ans2[x]=dfn_clock;
// for(int i=1;i<=n;i++) printf("cur[%d]=%d\n",i,cur[i]); puts("");
}int main()
// for(int i=1;i<=n;i++) printf("ru[%d]=%d\n",i,ru[i]);
dfn_clock=n;
memcpy(kkk,ru,sizeof(ru));
solve1();
for(int i=1;i<=n;i++) p[i]=i;
sort(&p[1],&p[n+1],cmp);
for(int i=1;i<=n;i++) printf("%d ",p[i]); puts("");
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++) printf("%d ",ans2[i]); puts("");
return 0;
}
NOI2010 航空管制
二元組的限制 考慮拓撲排序 正向拓撲不能保證最優,因卡的是結束時間 所以方向建圖topo 從n為0時間,相當於在n k i 的時間出現一架飛機 小根堆維護,每次選擇當前最早出現的一架飛機起飛。由於保證有解,這個顯然是正確的,對於當前只有一架飛機,不飛白不飛 當然也不能不飛 多架飛機,先飛後飛反正都是...
NOI2010 航空管制
貪心。對於第1個問,我們先建立拓撲圖,對於如果a必須在b前起飛,那麼連有向邊b a,並求出點的入度。將所有入度為0的點放在乙個優先佇列裡,按最大起飛編號從大到小排序。我們從後往前考慮起飛的航班。取出優先佇列中最大起飛編號最大的點,作為最後乙個航班,並刪去拓撲圖中與他相連的邊,如果有新的點的入度變成0...
NOI2010 航空管制
對於第一問,對於每條限制 u,v 我們連邊 v rightarrow u 這樣將構成一張 rm dag 首先先拓撲排序,對於拓撲序考前的點我們先讓他盡量往後放,顯然這樣是最優的,因為我們在偏序滿足條件的情況下讓每個點盡量後放以保證方案的合法性,但需要注意的一點是可能拓撲序大的點能放的位置比較靠後而拓...