網路流24題之T21 最長 k 可重區間集問題

2021-07-28 13:59:20 字數 2364 閱讀 5438

«

問題描述:

給定實直線 l 上

n 個開區間組成的集合

i,和乙個正整數

k,試設計乙個演算法,從開區間集合

i 中選取出開區間集合 sí

i,使得在實直線

l 的任何一點 x,

s中包含點

x 的開區間

個數不超過

k,且sigma(|z|)

達到最大。這樣的集合

s 稱為開區間集合

i 的最長

k可重區間集。

sigma(|z|)

稱為最長

k 可重區間集的長度。 «

程式設計任務:

對於給定的開區間集合

i 和正整數

k,計算開區間集合

i 的最長

k可重區間集的長度。

«資料輸入:

由檔案

input.txt

提供輸入資料。檔案的第

1 行有

2 個正整數 n和

k,分別表示開區間的個數和開區間的可重迭數。接下來的

n 行,每行有

2 個整數,表示開區間的左右端點座標。

«結果輸出

:程式執行結束時,將計算出的最長

k 可重區間集的長度輸出到檔案

output.txt中。

輸入檔案示例

input.txt

4 21 7

6 87 10

9 13

輸出檔案示例

output.txt

15題解:這道題屬於網路流中的最大權不相交路徑問題

先離散化,把原來的n的線段的端點離散化成1~2n這些數(這步是為了後面的處理更加方便)

建圖方式:

1、超級源s到1號點(也就是最左邊線段的左端點)連一條流量為k 費用為0的有向邊

2、2n號點到超級匯t(也就是最右邊線段的右端點)連一條流量為k 費用為0的有向邊

3、除s、t外的所有點x到x+1連一條流量為無限大 費用為0的有向邊

4、原來的所有線段的左端點到右端點連一條流量為1 費用為線段長度(在這題中=右端點-左端點,但因為是開區間,所以兩頭都不能要啊,應該=右端點-左端點-1)的有向邊

#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int oo=1000000005;

const int maxn=100005;

const int maxm=100005;

int i,ans,n,k,s,t,len,x;

int head[maxn];

int lz[maxn];

int l[maxn];

int dis[maxn];

int a[maxn];

int vis[maxn];

int pre[maxn];

int rz[maxn];

int r[maxn];

struct node

node(int x,int y)

bool operator < (const node &s) const

q.push(s);

vis[s]=1;

dis[s]=0;

a[s]=oo;

while(!q.empty())

}q.pop();

vis[x]=0;

}if(dis[t]==oo)

return -1;

x=t;

while(x!=s)

return sum;

}int main()

sort(lsh+1,lsh+1+(n<<1));

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

s=(n<<1)+1;

t=(n<<1)+2;

add(s,1,k,0,0);

add(1,s,0,0,0);

add(n*2,t,k,0,0);

add(t,n*2,0,0,0);

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

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

//for(i=0;i<=len;i++)

// printf("%d:%d %d %d %d %d\n",i,e[i].u,e[i].v,e[i].c,e[i].f,e[i].w);

while(1)

printf("%d\n",-ans);

return 0;

}

網路流24題21 最長k可重區間集問題

題面戳我 題目描述 對於給定的開區間集合i和正整數k,計算開區間集合i的最長k可重區間集的長度。輸入格式 的第 1 行有 2 個正整數n和k,分別表示開區間的個數和開區間的可重迭數。接下來的 n行,每行有 2 個整數,表示開區間的左右端點座標。輸出格式 將計算出的最長 k可重區間集的長度輸出 輸入輸...

網路流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次,問你路徑的最大權值和 其中有些邊可以無限制的走,但是...