【BZOJ 1497】 [NOI2006]最大獲利
阿新 • • 發佈:2018-05-09
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]最大獲利