P3357 最長k可重線段集問題 網路流

2022-05-03 14:06:16 字數 2557 閱讀 1764

給定平面 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 2

1 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建一條邊 流量為...