【问题描述】
且
。
,定义x和y之间的距离
。给定每个i和Ti之间的距离D(i,Ti),你需要求出一个满足要求的变换序列T。如果有多个满足条件的序列,输出其中字典序最小的一个。
【输入文件】
【输出文件】
如果至少存在一个满足要求的变换序列T,则输出文件中包含一行N个整数,表示你计算得到的字典序最小的T;否则输出”No Answer”(不含引号)。注意:输出文件中相邻两个数之间用一个空格分开,行末不包含多余空格。
【输入样例】
5
1 1 2 2 1
【输出样例】
1 2 4 0 3
【数据规模和约定】
20%的数据中N≤50;
60%的数据中N≤500;
100%的数据中N≤10000。
题目的意思就是给出x对y的对应关系,求是否存在一一对应的关系,有则输出字典序最小的一组。
观察可知,给定x到y的距离后,对于x最多只有四个可能的y与之对应。对于匈牙利算法的时间复杂度是O(nm),这道题就是一道赤果果的二分匹配题了。
还有一点可能会头疼的是要求字典序最小。回忆:找增光路的时候都是从最小的点开始找起。一旦找到增光路,就弹出真值。显然,每次找完第i个点,当前匹配中i对应的值一定是可行匹配中最“小”的。那么我们在找增光路的时候从n退回1增广,最后求出的匹配就是字典序最小的可行解了。还有就是用邻接表存边的时候要注意顺序,确保从字典序小的边找起。
第一次出错竟然是因为求增光路的时候没有给dfs函数赋初值,然后就。。。
AC CODE
program noi_2009_day1_transform;
var g,next:array[1..40000] of longint;
//============================================================================
procedure ins(x,y:longint);
begin
end;
//============================================================================
procedure init;
var i,x:longint;
begin
end;
//============================================================================
function dfs(u:longint):boolean;
var i,v:longint;
begin
end;
//============================================================================
begin
end.