标签:base station hdu 3879 最大权闭合图
5 5 1 2 3 4 5 1 2 3 2 3 4 1 3 3 1 4 2 4 5 3
4
思路:首先分析题目中的决策因素。在满足了第i个用户群后,便可以得到收益,然而满足第 个用户群需要有必要条件:建立中转站ai和中转站bi,同时要花去相应费用。留心这个所谓 的必要条件,便可联想到闭合图的性质。分析后发现,本题就是最大权闭合图的一个特例。把它抽象成这样一个有向图模型:每个用户群i作为一个结点分别向相应的中转站ai和中转站bi 连有向边。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 55005
#define MAXM 555005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b) for(i = a; i < b; i++)
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define DBG pf("Hi\n")
typedef long long ll;
using namespace std;
struct Edge
{
int u,v,cap,next;
}edge[MAXM];
int head[maxn],cur[maxn],level[maxn];
int num,n,m;
void init()
{
num=0;
mem(head,-1);
}
void addedge(int u,int v,int w)
{
edge[num].u=u; edge[num].v=v; edge[num].cap=w; edge[num].next=head[u]; head[u]=num++;
edge[num].u=v; edge[num].v=u; edge[num].cap=0; edge[num].next=head[v]; head[v]=num++;
}
bool bfs(int s,int t)
{
mem(level,-1);
queue<int>Q;
level[s]=0;
Q.push(s);
while (!Q.empty())
{
int u=Q.front();Q.pop();
for (int i=head[u];i+1;i=edge[i].next)
{
int v=edge[i].v;
if (edge[i].cap>0&&level[v]==-1)
{
level[v]=level[u]+1;
Q.push(v);
}
}
}
return level[t]!=-1;
}
int dfs(int u,int t,int f)
{
if (u==t) return f;
for (int &i=cur[u];i+1;i=edge[i].next)
{
int v=edge[i].v;
if (edge[i].cap>0&&level[v]==level[u]+1)
{
int d=dfs(v,t,min(f,edge[i].cap));
if (d>0)
{
edge[i].cap-=d;
edge[i^1].cap+=d;
return d;
}
}
}
return 0;
}
int dinic(int s,int t,int nodenum)
{
int flow=0;
while (bfs(s,t))
{
for (int i=0;i<nodenum+1;i++) cur[i]=head[i];
int f;
while ((f=dfs(s,t,INF))>0)
flow+=f;
}
return flow;
}
int main()
{
// freopen("C:/Users/asus1/Desktop/IN.txt","r",stdin);
int i,j,u,v,w;
while (~sff(n,m))
{
int sum=0;
init();
for (i=1;i<=n;i++)
{
scanf("%d",&w);
addedge(m+i,n+m+1,w);
}
for (i=1;i<=m;i++)
{
sfff(u,v,w);
sum+=w;
addedge(0,i,w);
addedge(i,u+m,INF);
addedge(i,v+m,INF);
}
printf("%d\n",sum-dinic(0,n+m+1,n+m+2));
}
return 0;
}
Base Station (hdu 3879 最大权闭合图)
标签:base station hdu 3879 最大权闭合图
原文地址:http://blog.csdn.net/u014422052/article/details/45438039