航线交叉
有一条河道,河道南北两侧分别有n个城市,0 < n < 100,南北的城市之间有航线相连,但是有的航线是有交叉的,容易产生事故。现在已知每个城市有且只有一条航线与对岸的某个城市相连,希望减少一些航线来避免事故,请问减少的最小航线数是多少?
例如上图中,需要去掉的航线数是3,分别是1-2, 4-4, 6-3这三条(其中前面一个数字表示北面的城市号,后一个数字表示南面的城市号)。
输入的第一个数是城市数n,接下来2个数为一组,有n组城市航线对,第一个数字代表北面的城市号,后一个数字代表南面的城市号。
输出为需要减少的最少航线数。
样例输入:
6 1 2 2 1 3 5 4 4 5 6 6 3
样例输出:
3
遍歷1-n的節點計算每個城市的相交數量,去掉最多者,重複多次直到無相交為止。
計算相交的方法:
a b c d
boolean = (a-c)*(c-d)
以航線交叉的地方和城市為節點,增加一個來源節點和終點,用最大流。
邊的賦值,假設源節點在上,終點在下,在第一次交叉之前,每條邊賦值1,第一次交叉之後,選擇一條交叉次數最少的賦值1,其餘賦值零。還沒證明演算法是對的,不過腦補了一下,應該是對的,懶得證了。
將起點的終點 設為兩列向量,然後用終點值減去起點值,找出不小於0的航線 去掉。
以一側城市編號遞增排序,找對岸城市編號的最長不下降序列,用總城市數減去找到的序列長度就可以了。