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

2022-05-15 09:50:37 字數 2423 閱讀 4181

時空限制1000ms / 128mb

給定平面 x−o−y 上 n個開線段組成的集合 i,和乙個正整數 k。試設計乙個演算法,從開線段集合 i 中選取出開線段集合 s⊆i ,使得在 x 軸上的任何一點 p,s中與直線 x=p 相交的開線段個數不超過 k,且∑​∣z∣達到最大。這樣的集合 s 稱為開線段集合 i的最長 k 可重線段集。∑​∣z∣ 稱為最長 k可重線段集的長度。

對於任何開線段 z,設其斷點座標為 (x0​,y0​) 和 (x1​,y1​),則開線段 z的長度 ∣z∣ 定義為:|z|=⌊sqrt⌋

對於給定的開線段集合 i 和正整數 k,計算開線段集合 i 的最長 k 可重線段集的長度。

輸入格式:

檔案的第一 行有 2 個正整數 n和 k,分別表示開線段的個數和開線段的可重疊數。

接下來的 n行,每行有 4 個整數,表示開線段的 2 個端點座標。

輸出格式:

程式執行結束時,輸出計算出的最長 k 可重線段集的長度。

輸入樣例: 

4 2

1 2 7 3

6 5 8 3

7 8 10 5

9 6 13 9

輸出樣例: 

17
1≤n≤500

1≤k≤13

最大權不相交路徑。和這一題很類似。但是這一題會出現線段垂直x軸的情況,這樣就會出現自環,而且是負環,所以直接跑費用流會有問題。因此要對每乙個點進行拆點,拆成1號點和2號點,具體連邊操作為:每個點和下乙個點之間連一條費用為0,容量為inf的邊。對於某線段,設其在x軸上投影的左右端點為點u和點v,若u=v,則在這個點的1號點和2號點之間連一條費用為邊權,容量為1的邊,否則在u的2號點和v的1號點之間連一條邊。

#include#define inf llong_max/2

#define n 3005

using

namespace

std;

structss;

ss edg[n*15

];int head[n],now_edge=0

;void addedge(int u,int v,long

long flow,long

long

cost)

; head[u]=now_edge++;

edg[now_edge]=(ss);

head[v]=now_edge++;

}int spfa(int s,int t,long

long &flow,long

long &cost)

; vis[s]=1

; queue

q;q.push(s);

long

long

dis[n];

for(int i=0;iinf;

dis[s]=0

;

int pre[n]=;

long

long addflow[n]=;

addflow[s]=inf;

while(!q.empty())}}

}if(dis[t]==inf)return0;

flow+=addflow[t];

cost+=addflow[t]*dis[t];

int now=t;

while(now!=s)

return1;

}void mcmf(int s,int t,long

long &flow,long

long &cost)

void

init()

long

long x[n][4

];long

long

lsh[n];

int size_lsh=0

;int f(long

long

x)long

long dist(long

long

x)int

main()

sort(lsh,lsh+size_lsh);

size_lsh=unique(lsh,lsh+size_lsh)-lsh;

int s=size_lsh*2+1,t=s+1

;

for(int i=1;i2;i++)addedge(i,i+1,inf,0

); addedge(s,

1,k,0

); addedge(size_lsh*2,t,inf,0

);

for(int i=1;i<=n;i++)

long

long flow=0,cost=0

; mcmf(s,t,flow,cost);

printf(

"%lld\n

",-cost);

return0;

}

view code

網路流24題 最長k可重區間集(費用流)

cogs loj洛谷 首先注意一下 這道題目裡面 在cogs上直接做就行了 洛谷和loj上需要判斷資料合法,如果 l r 就要交換l,r 首先離散化 資料範圍比較大 記錄一下l,r 和區間大小 這個問題可以換一種看法 相當於從源點出發,走k次,問你路徑的最大權值和 其中有些邊可以無限制的走,但是它們...

網路流24題 最長k可重區間集(費用流)

cogs loj洛谷 首先注意一下 這道題目裡面 在cogs上直接做就行了 洛谷和loj上需要判斷資料合法,如果 l r 就要交換 l,r 首先離散化 資料範圍比較大 記錄一下 l,r 和區間大小 這個問題可以換一種看法 相當於從源點出發,走k次,問你路徑的最大權值和 其中有些邊可以無限制的走,但是...

網路流24題 最長k可重區間集問題(費用流)

傳送門 考試的時候想到了費用流的一點東西,但是沒有寫出來,現在看來建圖也挺簡單的。s向1,n向t分別連一條容量為k,費用為0的邊,表示最多可以重疊k次 每個點向下乙個點連一條容量為inf,費用為0的邊,表示一種連線關係 對於每個區間,左端點向右端點連邊,容量為1,費用為區間長度 求最大費用最大流即可...