BZOJ 1562 變換序列

2022-05-13 10:33:53 字數 876 閱讀 5772

bzoj 1562 傳送門

一道比較考對$hungry$演算法理解的題目

首先可以輕鬆看出原序列和答案序列的對應關係,從而建出二分圖匹配模型

下面的關鍵在於如何保證字典序最小

第一種方式是暴力逐位確定:

對於$1....n$每一位都先貪心選取字典序小的節點,判斷將該邊除去後能否完全匹配,不能再修改

但這樣複雜度明顯是$o(n^3)$

第二種方式是逆向匹配:

其實就是暴力貪心的思想,但逆序匹配後就不用判斷了,省去了每次重複的判斷:

從後往前對於每個點先選擇字典序小的節點進行匹配,

由於這一位的權重比後面所有點的權重都大,因此在之前貪心的結果下盡量匹配當前點就是最優解

這樣就將複雜度降到了$o(n^2)$

#include using

namespace

std;

const

int maxn=1e4+10

;int n,x,mat[maxn],res[maxn],vis[maxn],g[maxn][2],idx=1

;int dfs(int

x) }

return0;

}int

main()

int sum=0

;

for(int i=n-1;~i;i--,idx++) sum+=dfs(i);

if(sum!=n) return puts("

no answer

"),0

;

for(int i=0;ii;

for(int i=0;i"

%d "

,res[i]);

return0;

}

BZOJ 1562 變換序列

二分圖匹配 要求字典序最小 匈牙利演算法 自n 1至0嘗試匹配 先嘗試小數,這個通過加邊順序控制 這樣高優先權位置只有在不可行時才取大數 include using namespace std const int maxn 11111 int n int d maxn int f maxn if m...

NOI2009 bzoj1562 變換序列

可以把距離看成每個點都有兩個匹配點,這樣就是求字典序最小的二分圖匹配。先任意求出乙個,然後從小到大考慮每個點,嘗試更換他的匹配點,但是要求不能改動之前的匹配。include include using namespace std const int maxn 10010 int a maxn fir...

BZOJ1562 NOI2009 變換序列

1 題意 題意有些難理解 2 分析 我們發現如果要求判斷是否合法的話就so easy了,二分圖匹配即可,但是我們發現要求輸出字典序最小的,那麼我們在匈牙利的時候就倒著列舉,另外鄰接表中的邊一定要排好序,如果用的是鍊錶的話,就從大到小,vector就從小到大插入,然後我們就可以保證字典序最小了,想了半...