給定平面 x-o-yx−o−y 上 nn 個開線段組成的集合 ii,和乙個正整數 kk 。試設計乙個演算法,從開線段集合 ii 中選取出開線段集合 s\subseteq is⊆i ,使得在 xx 軸上的任何一點 pp,ss 中與直線 x=px=p 相交的開線段個數不超過 kk,且\sum\limits_|z|z∈s∑∣z∣達到最大。這樣的集合 ss 稱為開線段集合 ii 的最長 kk 可重線段集。\sum\limits_|z|z∈s∑∣z∣ 稱為最長 kk 可重線段集的長度。
對於任何開線段 zz,設其斷點座標為 (x_0,y_0)(x0,y0) 和 (x_1,y_1)(x1,y1),則開線段 zz 的長度 |z|∣z∣ 定義為:|z|=\lfloor\sqrt\rfloor∣z∣=⌊(⌋
對於給定的開線段集合 ii 和正整數 kk,計算開線段集合 ii 的最長 kk 可重線段集的長度。
輸入格式:
檔案的第一 行有 22 個正整數 nn 和 kk,分別表示開線段的個數和開線段的可重疊數。
接下來的 nn 行,每行有 44 個整數,表示開線段的 22 個端點座標。
輸出格式:
程式執行結束時,輸出計算出的最長 kk 可重線段集的長度。
輸入樣例#1: 複製
4 21 2 7 3
6 5 8 3
7 8 10 5
9 6 13 9
輸出樣例#1: 複製
17
1\leq n\leq5001≤n≤500
1 \leq k \leq 131≤k≤13
這個題目和之前的最長k可重區間集問題是一樣的,就是把平面上的線段投影到x軸,但是呢,有乙個點有問題,就是要
特判兩條直線重合且垂直於x軸的這一種情況,具體是為什麼呢,我也有點不明白為什麼了,好像是會出現環的情況。
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace
std;
typedef
long
long
ll;const
int inf = 0x3f3f3f3f
;const
int maxn =1e5;
struct
edge
};vector
e;vector
g[maxn];
int a[maxn];//
找增廣路每個點的水流量
int p[maxn];//
每次找增廣路反向記錄路徑
int d[maxn];//
spfa演算法的最短路
int inq[maxn];//
spfa演算法是否在佇列中
ints, t;
void init(int
n)void add(int u, int v, int
c, ll cost)
bool bellman(int s, int t, int& flow, long
long &cost)
//bellman 演算法入隊
} }
}if (d[t] < 0)return
false;//
找不到增廣路
flow += a[t];//
最大流的值,此函式引用flow這個值,最後可以直接求出flow
cost += (long
long)d[t] * (long
long)a[t];//
距離乘上到達匯點的流量就是費用
for (int u = t; u != s; u = e[p[u]].u)//
逆向存邊
return
true;}
int maxcostmaxflow(int s, int t, long
long &cost)
struct
node
exa[maxn];
bool
cmp(node a, node b)
ll dis(
int x, int y, int x1, int
y1)int
main()
exa[i].cost =dis(exa[i].xx1, exa[i].yy1, exa[i].xx2, exa[i].yy2);
}sort(exa + 1, exa + 1 +n, cmp);
add(s, s1, m, 0);
for (int i = 1; i <= n; i++)
}ll cost = 0
;
int ans =maxcostmaxflow(s, t, cost);
printf(
"%lld\n
", cost);
return0;
}
洛谷P3357 最長k可重線段集問題 費用流
給定平面 x o yx o y 上 nn 個開線段組成的集合 ii 和乙個正整數 kk 試設計乙個演算法,從開線段集合 ii 中選取出開線段集合 s subseteq is i 使得在 xx 軸上的任何一點 pp ss 中與直線 x px p 相交的開線段個數不超過 kk 且 sum limits ...
Luogu3357 最長k可重線段集問題
problem 與 luogu3357 最長k可重區間集問題類似,但此題需要考慮斜率不存在的線段 我們將每個線段的兩個端點中 x 座標較小的那乙個認為是線段的起點,另乙個為終點 考慮拆點,我們將座標上的每乙個點拆成兩個點 2 x,2 x 1 對於一條線段,如果 x 是它的起點,將它設為 2 x 1 ...
P3358 最長k可重區間集問題
題目鏈結 輸入最多500個點對,即離散化後最多有1000個座標。對離散化後的座標建圖。方法一 將座標從小到大連邊,乙個點與它後面相鄰的點建一條邊 流量為inf,花費為0 點對的左端點與右端點建一條邊 流量為1,花費為 區間長度 s與第乙個點建一條邊 流量為k,花費為0 最後乙個點與t建一條邊 流量為...