ural 1076 Trash 二分图最大权匹配(费用流实现)

统计每种垃圾的总和,若将K种垃圾倒入第F个垃圾桶,那么花费就是K-F(k)  (自己已经有的垃圾不用倒)。

然后就是简单的二分图建图。

#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 1000
#define MAXM 1000000
#define INF 0x3f3f3f3f
struct node
{
	int u,v,f,c,next;
}e[MAXM];
int n,head[MAXN],pre[MAXN],dist[MAXN],vis[MAXN],ans;
int en,s,t,maxflow,mincost; //s源点,t汇点
void add(int u,int v,int c,int f)//加边
{
	e[en].u=u;
	e[en].v=v;
	e[en].c=c;
	e[en].f=f;
	e[en].next=head[u];
	head[u]=en++;
	e[en].u=v;
	e[en].v=u;
	e[en].c=-c;
	e[en].f=0;
	e[en].next=head[v];
	head[v]=en++;
}
int spfa()
{
	int i,u,v;
	for(i=0;i<=t;i++)
		pre[i]=-1,vis[i]=0,dist[i]=INF;
	dist[s]=0;
	vis[s]=1;
	queue<int>q;
	q.push(s);
	while(!q.empty())
	{
		u=q.front();
		q.pop();
		for(i=head[u];i!=-1;i=e[i].next)
		{
			v=e[i].v;
			if(e[i].f>0&&dist[u]+e[i].c<dist[v])
			{
				dist[v]=dist[u]+e[i].c;
				pre[v]=i;
				if(!vis[v])
				{
					vis[v]=1;
					q.push(v);
				}
			}
		}
		vis[u]=0;
	}
	if(dist[t]==INF)
		return 0;
	return 1;
}
void add()
{
	int v;
	int maxf=INF;
	for(v=pre[t];~v;v=pre[e[v].u])
		maxf=min(maxf,e[v].f);
	for(v=pre[t];~v;v=pre[e[v].u])
	{
		e[v].f-=maxf;
		e[v^1].f+=maxf;
		mincost+=e[v].c;
	}
	maxflow+=maxf;
}
void init()
{
    maxflow=0;
    mincost=0;
    en=0;
    s=0;
    t=n+n+1;
    memset(head,-1,sizeof(head));
}
int a[155][155];
int type[155];
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
	    memset(type,0,sizeof(type));
	    for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&a[i][j]);
                type[j]+=a[i][j];
            }
        }
        init();
        for(int i=1;i<=n;i++) add(s,i,0,1);
        for(int i=n+1;i<=n+n;i++) add(i,t,0,1);
        for(int i=1;i<=n;i++)
        {
            for(int j=n+1;j<=n+n;j++)
            {
                add(i,j,type[i]-a[j-n][i],1);
            }
        }
		while(spfa())
			add();
        printf("%d\n",mincost);
	}
	return 0;
}

ural 1076 Trash 二分图最大权匹配(费用流实现),布布扣,bubuko.com

时间: 2024-08-07 21:19:52

ural 1076 Trash 二分图最大权匹配(费用流实现)的相关文章

POJ2195 Going Home[费用流|二分图最大权匹配]

Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22088   Accepted: 11155 Description On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertica

[hdu1533]二分图最大权匹配 || 最小费用最大流

题意:给一个n*m的地图,'m'表示人,'H'表示房子,求所有人都回到房子所走的距离之和的最小值(距离为曼哈顿距离). 思路:比较明显的二分图最大权匹配模型,将每个人向房子连一条边,边权为曼哈顿距离的相反数(由于是求最小,所以先取反后求最大,最后再取反回来即可),然后用KM算法跑一遍然后取反就是答案.还可以用最小费用最大流做,方法是:从源点向每个人连一条边,容量为1,费用为0,从每个房子向汇点连一条边,容量为1,费用为0,从每个人向每个房子连一条边,容量为1,费用为曼哈顿距离的值,建好图后跑一遍

【网络流24题】No.18 分配问题 (二分图最佳匹配 费用流|KM)

[题意] 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为 cij . 试设计一个将n 件工作分配给 n 个人做的分配方案, 使产生的总效益最大. 输入文件示例input.txt52 2 2 1 22 3 1 2 42 0 1 1 12 3 4 3 33 2 1 2 1 输出文件示例output.txt514 [分析] 很裸的..二分图最大权匹配. 等一下可以打一下KM... 1 #include<cstdio> 2 #include<cstdlib>

ural 1076 KM求最小权匹配

贴模板~ KM算法引进了顶标函数,不断缩小这个顶标来让相等子图的可能范围扩大 #include<iostream> #include<cstring> //KM 复杂度O^3 using namespace std; const int N=200; int lx[N],ly[N];//顶标函数 int w[N][N];//图 bool vix[N],viy[N]; int linky[N];// int lack;//每次顶标函数扩大的增量 int n,m; bool find(

[ACM] HDU 2255 奔小康赚大钱 (二分图最大权匹配,KM算法)

奔小康赚大钱 Problem Description 传说在遥远的地方有一个很富裕的村落,有一天,村长决定进行制度改革:又一次分配房子. 这但是一件大事,关系到人民的住房问题啊. 村里共同拥有n间房间,刚好有n家老百姓,考虑到每家都要有房住(假设有老百姓没房子住的话.easy引起不安定因素),每家必须分配到一间房子且仅仅能得到一间房子. 还有一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.因为老百姓都比較富裕,他们都能对每一间房子在他们的经济范围内出一定的价格,比方有3间房

HDU2255 奔小康赚大钱 —— 二分图最大权匹配

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11022    Accepted Submission(s): 4877 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行

二分图最大权匹配(KM算法)

#80. 二分图最大权匹配 统计 描述 提交 自定义测试 从前一个和谐的班级,有 $n_l$ 个是男生,有 $n_r$ 个是女生.编号分别为 $1, \dots, n_l$ 和 $1, \dots, n_r$. 有若干个这样的条件:第 $v$ 个男生和第 $u$ 个女生愿意结为配偶,且结为配偶后幸福程度为 $w$. 请问这个班级里幸福程度之和最大是多少? 输入格式 第一行三个正整数,$n_l, n_r, m$. 接下来 $m$ 行,每行三个整数 $v, u, w$ 表示第 $v$ 个男生和第 $

URAL 1076 Trash Trash(最大权匹配)

Trash Time limit: 1.0 secondMemory limit: 64 MB You were just hired as CEO of the local junkyard.One of your jobs is dealing with the incoming trash and sorting it for recycling.The trash comes every day in N containers and each of these containers c

【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)

3308: 九月的咖啡店 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 244  Solved: 86 Description 深绘里在九份开了一家咖啡让,如何调配咖啡民了她每天的头等大事我们假设她有N种原料,第i种原料编号为i,调配一杯咖啡则需要在这里若干种兑在一起.不过有些原料不能同时在一杯中,如果两个编号为i,j的原料,当且仅当i与j互质时,才能兑在同一杯中.现在想知道,如果用这N种原料来调同一杯咖啡,使用的原料编号之和最大可为多少. In