1. 程式人生 > >【BZOJ 1497】 [NOI2006]最大獲利

【BZOJ 1497】 [NOI2006]最大獲利

cout black head inf 依賴 font truct 一個 所有

【鏈接】 我是鏈接,點我呀:)
【題意】


在這裏輸入題意

【題解】


最大權閉合子圖的模板題。
每個人對兩個物品有依賴。
則相當於m+n個點
這m個點是m個用戶。
每個用戶的權值是正的,為這個用戶獲得的利益。
然後每個基站對應n個點。這n個點上的權值都是負數的。
表示代價。

然後就是最大權閉合子圖問題了。

套一個網絡流模型

源點s和每個人連流量為利益的邊。
每個基站和匯點t連流量為代價的絕對值的邊。
用戶和基站對應的邊。流量改為正無窮。

這樣這個網絡的每個割(S,T)中 集合S除去匯點s剩下的點。
就是原圖的一個閉合子圖了。
(而且會發現每個閉合子圖都能由一個割,一一對應

分析一下會發現當求得最小割的時候。

得到的閉合子圖權值是最大的。
而且這個閉合子圖的權值就是所有正權的權值和減去最小割。

參考 胡伯濤 《最小割模型在信息學競賽中的應用》

【代碼】

#include<bits/stdc++.h>
using namespace std;

const int N = 5000;
const int M = 50000;
const int INF = 100*5000+50000*100 + 10;
const int s = 0;

struct node{
    int v,w,nex;
}edge[(M*3+N+100)*2];

int n,m,w[N+10],head[N+M+100],cur[N+M+100],k,d[N+M+100
],t; int Q[N+M+100]; void addEdge(int u,int v,int w){ edge[k].v = v; edge[k].w = w; edge[k].nex = head[u]; head[u] = k++; edge[k].v = u; edge[k].w = 0; edge[k].nex = head[v]; head[v] = k++; } int bfs() { memset(d, 0, sizeof(d)); d[s] = 1; int frnt = 0, rear = 0
; Q[rear++] = s; while(frnt != rear) { int u = Q[frnt++]; if(u == t) return 1; for(int i = head[u]; i != -1; i = edge[i].nex) { int to = edge[i].v, w = edge[i].w; if(w && d[to] == 0) { d[to] = d[u] + 1; if(to == t) return 1; Q[rear++] = to; } } } return 0; } int dfs(int u, int maxflow) { if(u == t || !maxflow) return maxflow; int ret = 0; for(int& i = cur[u]; i != -1; i = edge[i].nex) { int to = edge[i].v, w = edge[i].w; if(w && d[to] == d[u]+1) { int f = dfs(to, min(maxflow-ret, w)); edge[i].w -= f; edge[i^1].w += f; ret += f; if(ret == maxflow) return ret; } } return ret; } int Dicnic(){ int ans = 0; while (bfs()==1){ memcpy(cur,head,sizeof(head)); ans+=dfs(0,INF); } return ans; } int main() { memset(head,255,sizeof head); cin >> n >> m; t = n+m+1; for (int i = 1;i <= n;i++) cin >> w[i]; int ans = 0; for (int i = 1;i <= m;i++){ int x,y,z; cin >> x >> y >> z; addEdge(i,m+x,INF);addEdge(i,m+y,INF); addEdge(0,i,z); ans+=z; } for (int i = 1;i <= n;i++) addEdge(m+i,m+n+1,w[i]); cout<<ans-Dicnic()<<endl; return 0; }

【BZOJ 1497】 [NOI2006]最大獲利