«
問題描述:
給定實直線 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次,問你路徑的最大權值和 其中有些邊可以無限制的走,但是...