時空限制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
171≤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/2view code#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;
}
網路流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,費用為區間長度 求最大費用最大流即可...