POJ 3680 最小費用最大流

2021-07-11 11:48:18 字數 937 閱讀 6088

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

const int maxn = 500;

const int maxm = 1e5 + 10;

const int inf = 0x3f3f3f3f;

struct edge

;edge edge[maxm];

int head[maxn], tol, pre[maxn], dis[maxn], n, k, m, a[maxn], b[maxn], w[maxn], res[maxm], t, cnt;

bool vis[maxn];

void addedge(int u, int v, int cost, int cap)

bool spfa(int s, int t)

}} }

return (pre[t] == -1 ? false : true);

}int mincostmaxflow(int s, int t, int &cost)

flow += min;

} return flow;

}int main(int argc, char const *argv)

return 0;

}

題意:給定n個帶權開區間,選擇其中一些使得權值最大並且區間重疊層數不超過k。

題解:最小費用流,區間有兩百個,可以用左邊的點發出一條到右邊的點的邊,容量為1,費用為負的權值。然後從左往右將依次將相鄰的兩個點都連起來,權值為0,容量為k,也就是說,如果選了這個區間,就會從費用為負數的邊流過去,否則,就是從這個費用為0的邊流過去。然後建立乙個虛擬源點與最左邊的點相連,權值為0,容量為k,這樣就保證了重疊數之多為k,因為增廣路上所經過的區間必定是不重合的,而流量只有k,所以滿足題意。

poj 3680 最小費用最大流

思路 因為n 200,而區間範圍為 1,100000 因此需要離散化,去重,然後就是建圖了相連兩點連邊,容量為k,費用為0,然後就是對區間端點進行連邊,容量為1,費用為權值,最後就是跑費用流了。1 include2 include3 include4 include5 include6 using ...

poj 3680 最小費用最大流

思路 因為n 200,而區間範圍為 1,100000 因此需要離散化,去重,然後就是建圖了相連兩點連邊,容量為k,費用為0,然後就是對區間端點進行連邊,容量為1,費用為權值,最後就是跑費用流了。1 include2 include3 include4 include5 include6 using ...

最小費用最大流POJ 3680

類似問題,比如有k的限制,某件事情只能做k次,或者事件一一對應,都可以建圖跑流來解決。比線段樹好使我感覺。從s 1 2 3 t建立一條通路 先離散化了頂點的,離散模板就好了 代價為零,流量為k 其實是多少無所謂,比k就行 然後如果1 3有區間的話,就建立一條負的代價,因為求的是最大費用,模板我們都是...