首页 > 其他分享 >P4014 分配问题

P4014 分配问题

时间:2023-03-25 12:56:22浏览次数:31  
标签:int mn 问题 add hd go 分配 P4014 dis

 

有 n 件工作要分配给 n 个人做。第 i个人做第 j件工作产生的效益为 c

试设计一个将 n 件工作分配给 n 个人做的分配方案,使产生的总效益最大。

 

输入

5
2 2 2 1 2
2 3 1 2 4
2 0 1 1 1
2 3 4 3 3
3 2 1 2 1

 

 二分图模型

直接跑费用流  ,add_(S,i,1,0)    add(i+n,T, 1, 0)   add(i,i+n,1, a[i][j] )

 

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N =500, M=1e5+100;

 #define inf 1e9
 int all=1,hd[N],go[M],w[M],nxt[M],cost[M];
 
 int S,T,n,m;
 int pre[N],mn[N],dis[N],vis[N],ans=0;
 
 void add_(int x,int y,int z,int c){
     nxt[++all]=hd[x]; hd[x]=all; go[all]=y;
     w[all]=z; cost[all]=c;
     
     swap(x,y);
     nxt[++all]=hd[x]; hd[x]=all; go[all]=y;
     w[all]=0; cost[all]= -c; 
 }
 
 bool spfa__min(){
 	int i;
 	queue<int> q;
 	q.push(S);
 	for(i=0;i<N;i++) dis[i]=inf;
 	for(i=0;i<N;i++) vis[i]=0;
 	mn[S]=inf, dis[S]=0, vis[S]=1;
 	
 	while(!q.empty()){
 		int x=q.front();
 		vis[x]=0;
 		q.pop();
 		for(i=hd[x];i;i=nxt[i]){
 			int y=go[i],z=w[i],c=cost[i];
 			if(w[i]==0) continue; 
 			
 			if(dis[x]+c<dis[y]){
 				dis[y]=dis[x]+c;
 				mn[y]=min(mn[x],z);
 				pre[y]=i;
 				if(vis[y]==0) vis[y]=1,q.push(y);
 			}
 		}
 	}
 	if(dis[T]==inf) return 0; return 1;
 }
 bool spfa__max(){
 	int i;
 	queue<int> q;
 	q.push(S);
 	for(i=0;i<N;i++) dis[i]= -inf;
 	for(i=0;i<N;i++) vis[i]=0;
 	mn[S]=inf, dis[S]=0, vis[S]=1;
 	
 	while(!q.empty()){
 		int x=q.front();
 		vis[x]=0;
 		q.pop();
 		for(i=hd[x];i;i=nxt[i]){
 			int y=go[i],z=w[i],c=cost[i];
 			if(w[i]==0) continue; 
 			
 			if(dis[x]+c>dis[y]){
 				dis[y]=dis[x]+c;
 				mn[y]=min(mn[x],z);
 				pre[y]=i;
 				if(vis[y]==0) vis[y]=1,q.push(y);
 			}
 		}
 	}
 	return dis[T]== -inf ?0:1;
 }
 void solve(){
 	int maxf=0, minc=0;
 	while(spfa__min()){
 		int x= T;
 		maxf+=  mn[T] ,minc+= mn[T]*dis[T];
 		
 		while(x!=S){
 			int i=pre[x];
 			w[i]-= mn[T];
 			w[i^1]+=mn[T];
 			x=go[i^1];
 		}
 	}
 	cout<<minc<<endl;
 	
 	
 	for(int i=2; i<=all; i+=2) 
 		w[i]+=w[i^1],w[i^1] = 0;
 	 maxf=0; int maxc=0;
 	while(spfa__max()){
 		int x= T;
 		maxf+=  mn[T] , maxc+= mn[T]*dis[T];
 		
 		while(x!=S){
 			int i=pre[x];
 			w[i]-= mn[T];
 			w[i^1]+=mn[T];
 			x=go[i^1];
 		}
 	}
 	cout<<maxc<<endl;
 }
 signed main(){
 	int i,j;
 	cin>>n;
 	S=0,T=2*n+1;
 	for(i=1;i<=n;i++) 
 		for(j=1;j<=n;j++){
 			int x; cin>>x; add_(i,j+n,1,x);
 		}
 	for(i=1;i<=n;i++) add_(S,i,1,0);
 	for(i=n+1;i<=2*n;i++) add_(i,T,1,0);
 	solve();
 }

 

标签:int,mn,问题,add,hd,go,分配,P4014,dis
From: https://www.cnblogs.com/towboa/p/17254535.html

相关文章

  • Android Studio Gradle Sync issues问题
     当时重装系统,发现出了这个问题,展开发现JDK相关。 在csdn搜索,后将默认的更改为java用的8版本。    退出,重新进入,完成。第一次耗时很久,33分钟。后面再进就......
  • Arcmap出现拓扑无效问题怎么解决
    在ArcMap中出现拓扑无效错误通常是由于要素类之间存在空间关系不一致或拓扑错误导致的。以下是几种可能的解决方案:运行“检查几何”工具,以确定是否存在几何错误。如果有几......
  • 来说一个技术点,List作为参数数据丢失问题
    当List作为方法入参时,你在方法里可以改变List中的元素,包括增减元素,但是不能给List对象重新赋值。下面方法,执行foo1,结果会是什么?privatevoidfoo1()......
  • 【通信】基于最大能量效率的SCMA系统功率分配算法设计附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 四色问题
    哦耶!点击查看代码给定N(小于等于8)个点的地图,以及地图上各点的相邻关系,请输出用4种颜色将地图涂色的所有方案数(要求相邻两点不能涂成相同的颜色)数据中0代表不相邻,1代表......
  • 关于 SAP UI5 接口 sap.ui.core.IAsyncContentCreation 的问题讨论
    SAPUI5接口sap.ui.core.IAsyncContentCreation是一种异步内容创建接口,用于延迟创建UI元素。在SAPUI5中,UI元素通常是使用XML视图或JS视图创建的,这些视图可以在页面加载......
  • vscode保存文件慢——如何检验是哪个vscode插件导致的问题
    起因前几天使用vscode,突然发现保存文件变得特别慢==排查开发者工具里能看到[ExtensionHost]有很多报错。(开发者工具:默认快捷键ctrl+shift+i打开,或选择help=>Tog......
  • 区间染色问题
    区间染色问题将一个区间内的点分别染色,问共有多少种颜色可以被看到(已经被染色的点可以被覆盖这个区间的颜色所覆盖)例题:poj2527线段树的每个节点用一个懒标记维护当......
  • STM32F103 UCOSIII 加入DS18B20温度传感器 解决不能正常读数问题
    前言:在UCOSIII中加入DS18B20后,会发现检测出的数字特别大,而且波动很大就是一些无规则随机数一样,裸机运行明明是没问题的(这个问题困扰了3天),网上查了一下,发现出现此问题的不......
  • JavaScript数值计算时精度问题处理
    js精度问题当使用JavaScript进行数值计算时,会面临一些精度问题,这些问题可能会导致不正确的结果。以下是一些常见的奇奇怪怪的js数据精度问题:1.浮点数精度问题在JS......