[codevs 1033] 蚯蚓的游戏问题
生活随笔
收集整理的這篇文章主要介紹了
[codevs 1033] 蚯蚓的游戏问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[codevs 1033] 蚯蚓的游戲問題
題解:
首先每個點只能走一次,所以要靠拆點 (X -> Xi, Xj) 來限制每個點走的次數,容量為1,費用為食物量的相反數。 從源點向所有第一層的點 Xi 連一條容量為1,費用為0的邊。 從最后一層的點 Xj 向匯點連一條容量為1,費用為0的邊。 因為從源點向所有第一層的點連邊不考慮蚯蚓個數,即沒有限制最大流量,所以再建立一個超級匯點,從匯點到超級匯點連一條容量為蚯蚓條數,費用為0的邊,求最小費用最大流,最后答案就是從源點到超級匯點的費用的相反數;也可以建立超級源點,從超級源點向源點連邊限制流量。代碼:
耗時:19ms 內存:872B #include<cstdio> #include<iostream> #include<vector> #include<queue> #include<algorithm> using namespace std;const int maxn = 3000 + 10; const int INF = 1000000007;int n, m, k, s, t, delta; int map[maxn][maxn], ID[maxn][maxn];struct Edge {int from, to, cap, flow, cost; };vector<Edge> edges; vector<int> G[maxn];void AddEdge(int from, int to, int cap, int cost) {edges.push_back((Edge){from, to, cap, 0, cost});edges.push_back((Edge){to, from, 0, 0, -cost});int sz = edges.size();G[from].push_back(sz-2);G[to].push_back(sz-1); }bool inq[maxn]; int a[maxn], d[maxn], p[maxn];bool BellmanFord(int& flow, int& cost) {for(int i = s; i <= t; i++) d[i] = INF;memset(inq, 0, sizeof(inq));d[s] = 0; inq[s] = 1; p[s] = 0; a[s] = INF;queue<int> Q;Q.push(s);while(!Q.empty()) {int x = Q.front(); Q.pop();inq[x] = 0;for(int i = 0; i < G[x].size(); i++) {Edge& e = edges[G[x][i]];if(e.cap > e.flow && d[e.to] > d[x] + e.cost) {d[e.to] = d[x] + e.cost;p[e.to] = G[x][i];a[e.to] = min(a[x], e.cap-e.flow);if(!inq[e.to]) {Q.push(e.to);inq[e.to] = 1;}}}}if(d[t] == INF) return 0;flow += a[t];cost += d[t] * a[t];int x = t;while(x != s) {edges[p[x]].flow += a[t];edges[p[x]^1].flow -= a[t];x = edges[p[x]].from;}return 1; }void MincostMaxflow() {int flow = 0, cost = 0;while(BellmanFord(flow, cost));cout << -cost << endl; }void init() {cin >> n >> m >> k;for(int i = 1; i <= n; i++)for(int j = 1; j < m+i; j++) {ID[i][j] = ++t;cin >> map[i][j];}delta = t;t = t * 2 + 2;int _t = t-1;for(int x = 1; x <= n; x++)for(int y = 1; y < x+m; y++) {int& id = ID[x][y];AddEdge(id, id+delta, 1, -map[x][y]);if(x == 1) AddEdge(s, id, 2, 0);if(x == n) AddEdge(id+delta, _t, 2, 0); //key1else {AddEdge(id+delta, ID[x+1][y], 1, 0);AddEdge(id+delta, ID[x+1][y+1], 1, 0);}}AddEdge(_t, t, k, 0); }int main() {init();MincostMaxflow();return 0; }與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的[codevs 1033] 蚯蚓的游戏问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于相似学习的目标跟踪方法
- 下一篇: [codevs 1227] 方格取数2