标签:
最大费用最大流。分为两个集合,流量为1,费用为给的值即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#define maxv 202
#define maxe 20005
#define inf 12345678
using namespace std;
int ff,vv,g[maxv],prev[maxv],pree[maxv],dis[maxv];
bool use[maxv];
struct edge
{
int v,f,c,nxt;
}e[maxe];
int s,t,x,nume=1;
void addedge(int u,int v,int f,int c)
{
e[++nume].v=v;
e[nume].c=c;
e[nume].f=f;
e[nume].nxt=g[u];
g[u]=nume;
e[++nume].v=u;
e[nume].c=-c;
e[nume].f=0;
e[nume].nxt=g[v];
g[v]=nume;
}
bool spfa()
{
queue <int> q;
memset(dis,0x3f,sizeof(dis));
memset(pree,0,sizeof(pree));
memset(prev,0,sizeof(prev));
dis[s]=0;
q.push(s);
while (!q.empty())
{
int head=q.front();
q.pop();
use[head]=false;
for (int i=g[head];i;i=e[i].nxt)
{
int v=e[i].v;
if ((e[i].f>0) && (dis[v]>dis[head]+e[i].c) )
{
dis[v]=dis[head]+e[i].c;
pree[v]=i;
prev[v]=head;
if(!use[v])
{
q.push(v);
use[v]=true;
}
}
}
}
if (dis[t]==1061109567) return false;
return true;
}
int dinic()
{
int rq=0,u=t,deltas=inf;
while (u!=s)
{
deltas=min(deltas,e[pree[u]].f);
u=prev[u];
}
u=t;
while (u!=s)
{
int r=pree[u];
e[r].f=e[r].f-deltas;
e[r^1].f=e[r^1].f+deltas;
u=prev[u];
}
return dis[t]*deltas;
}
int main()
{
s=0;
memset(g,0,sizeof(g));
scanf("%d%d",&ff,&vv);
t=ff+vv+1;
for (int i=1;i<=ff;i++)
addedge(s,i,1,0);
for (int i=1;i<=vv;i++)
addedge(i+ff,t,1,0);
for (int i=1;i<=ff;i++)
for (int j=1;j<=vv;j++)
{
scanf("%d",&x);
addedge(i,j+ff,1,-x);
}
int maxcost=0;
while (spfa()==true)
maxcost=maxcost+dinic();
printf("%d\n",-maxcost);
return 0;
}
标签:
原文地址:http://www.cnblogs.com/ziliuziliu/p/5093367.html