NOI2009 變換序列

2022-08-20 23:24:20 字數 902 閱讀 5731

here

簡要題意就是給定乙個排列,每個元素有兩個對應關係,問你是否能將該排列轉換為另乙個排列,並使之字典序最小,如果不考慮字典序的話,這題就是裸的一道求二分圖完美匹配的題,那麼我們該如何考慮字典序呢?

我們可以按字典序暴力列舉左邊的點與右邊的哪個點相匹配,再跑二分圖。

實際上我們可以不這樣做,二分圖匹配的過程實際上是貪心的過程,我們為了滿足當前點,有時會讓已經匹配的點更換匹配點,那麼我們讓字典序小的靠前選擇,並且下往上倒著匹配,就可以滿足字典序最小了。

#include#include#includeusing namespace std;

const int m = 100010;

const int n = 100010;

int read()

while(ch>='0'&&ch<='9')

return x * f;

}struct nodeedge[m << 1];

int head[n], num;

void build(int from, int to)

int match[n], vis[n];

int n;

int ans[n];

bool dfs(int u)

} }return 0;

}int main()

int ans = 0;

for(int i=n-1; i>=0; i--)

} for(int i=0; i<=n-1; i++){

cout《有幾點要注意的:

點是從零開始編號的,所以 \(match\) 陣列初始化為 \(-1\) 而不是 \(0\)

有乙個小技巧,對每個點 \(u\) 進行匹配的時候,不用重新清零 \(vis\) 陣列,只用在標記時將其標記為當前匹配點的編號( \(u\) )就好~

noi2009變換序列

2009年noi全國競賽 時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 題解 description 對於n個整數0,1,n 1,乙個變換序列t可以將i變成ti,其中 ti 且ui 1 to n 1 任意x,y 定義x和y之間的距離d x,y min。給定每個i和ti...

NOI2009 變換序列

讀懂題意後發現這道題最主要是要求出字典序最小的排列,考察了匈牙利演算法的實質。首先對於 d i 的定義,我們可以解出可能的 t i 然後將 i 與 t i 連邊,求最大匹配。如果最大匹配 但是要求字典序最小。第一中方法在我 ac 後翻看題解而寫的。這個程式是根據匈牙利演算法的實質寫的。對於乙個待匹配...

NOI2009 變換序列

51 1 2 2 1 1 2 4 0 3 30 的資料中n 50 60 的資料中n 500 100 的資料中n 10000。二分圖匹配 匈牙利演算法的原理是衝突時替換 不過要求字典序最小,乙個點會連出2條邊,加邊先加入大的,這樣在匹配時就會先匹配小的 不過這是針對於鏈式前向星 然後如果i和j都匹配了...