首页 > 其他分享 >洛谷P2762 太空飞行计划问题 笔记

洛谷P2762 太空飞行计划问题 笔记

时间:2024-02-28 21:48:06浏览次数:24  
标签:used 洛谷 int flow 实验 P2762 return 太空飞行 dis

传送门

神奇的题目。

正解就是源点向实验连边,边权为收益。然后仪器向汇点连边,边权为代价。

然后答案就是所有实验收益之和-最小割。

考虑证明。首先所有实验收益之和显然对应了做所有的实验。
然后考虑割掉一条边。如果割掉的是源点->实验,那么就是不做这个实验。如果割了仪器->汇点,那么就是买下这个仪器。

显而易见,实验该有的仪器都要有,对应到图中就是要做的实验对应过去的所有仪器都和汇点断了边。 这恰恰等同于源点与汇点的不连通。于是此时求出的最小割就是最小代价。最后将收益之和减去这个代价就是答案。

code

//writer:Oier_szc

#include <bits/stdc++.h>
//#include <windows.h>
#define TS cerr<<"I AK IOI"<<endl;
#define cr(x) cerr<<x<<endl;
#define cr2(x,y) cerr<<x<<" "<<y<<endl;
#define cr3(x,y,z) cerr<<x<<" "<<y<<" "<<z<<endl;
#define int long long
using namespace std;
const int N=55,M=3e3+5,INF=2e9,mod=1e9+7;
int m,n,s,t,ans=0;
int p[N],c[N];
int head[N<<1],tot=1;
struct edge
{
	int ne,to,w;
}e[M<<1];
void add(int u,int v,int w)
{
	e[++tot]={head[u],v,w};
	head[u]=tot;
	e[++tot]={head[v],u,0};
	head[v]=tot;
}
int dis[N<<1],cur[N<<1];
bool bfs()
{
	for(int i=s;i<=t;++i)
	{
		dis[i]=-1;
		cur[i]=head[i];
	}
	queue<int> q;
	q.push(s),dis[s]=1;
	while(!q.empty())
	{
		int now=q.front(),to;
		q.pop();
		for(int i=head[now];i;i=e[i].ne)
		{
			to=e[i].to;
			if(e[i].w&&dis[to]==-1)
			{
				dis[to]=dis[now]+1;
				if(to==t) return true;
				q.push(to);
			}
		}
	}
	return false;
}
int dfs(int u,int flow)
{
	if(u==t) return flow;
	int used=0,to;
	for(int i=cur[u];i;i=e[i].ne)
	{
		cur[u]=i,to=e[i].to;
		if(e[i].w&&dis[to]==dis[u]+1)
		{
			int x=dfs(to,min(flow,e[i].w));
			flow-=x,used+=x;
			e[i].w-=x,e[i^1].w+=x;
			if(!flow) break;
		}
	}
	if(!used) dis[u]=-1;
	return used;
}
int Dinic()
{
	int res=0;
	while(bfs()) res+=dfs(s,INF);
	return res;
}
signed main()
{
	scanf("%lld%lld",&m,&n);
	s=0,t=m+n+1;
	int re;
	for(int i=1;i<=m;++i)
	{
		scanf("%lld",&p[i]);
		add(s,i,p[i]),ans+=p[i];
		while(getchar()==' ')
		{
			scanf("%lld",&re);
			add(i,m+re,INF);
		}
	}
	for(int i=1;i<=n;++i)
	{
		scanf("%lld",&c[i]);
		add(m+i,t,c[i]);
	}
	ans-=Dinic();
	for(int i=1;i<=m;++i)
	{
		if(dis[i]!=-1) printf("%lld ",i);
	}
	printf("\n");
	for(int i=1;i<=n;++i)
	{
		if(dis[m+i]!=-1) printf("%lld ",i);
	}
	printf("\n%lld",ans);
	return 0;
}

标签:used,洛谷,int,flow,实验,P2762,return,太空飞行,dis
From: https://www.cnblogs.com/StevenZC/p/18041955

相关文章

  • 洛谷题单指南-二分查找与二分答案-P2249 【深基13.例1】查找
    原题链接:https://www.luogu.com.cn/problem/P2249题意解读:找有序数组中某个数第一次出现的位置,二分模版题,由于是二分板块的第一题,有必要对二分的各种模版进行介绍。解题思路:关于二分的一切:1、二分的本质二分的本质,是通过某种判定把目标范围划分成两个区间二分问题通常有两......
  • 洛谷题单指南-贪心-P1080 [NOIP2012 提高组] 国王游戏
    原题链接:https://www.luogu.com.cn/problem/P1080题意解读:通过不同的排队方式,让获得最多奖赏的大臣金额尽可能的少。此题如果没有思路,用全排列枚举可以“骗”分,更好的做法直觉上是某种贪心策略,另外基于数据规模考虑,要拿满分,需要上高精度。下面就由浅入深一步一步的解决。解题思......
  • 洛谷题单指南-贪心-P4447 [AHOI2018初中组] 分组
    原题链接:https://www.luogu.com.cn/problem/P4447题意解读:将一个有序的数列,按不重复连续数分成一组,可分成若干组,使得人数最少的组在各种分组方式之中是最大的。解题思路:观察样例说明,有6个测试点的ai​互不相同,因此直接将数据排序,然后连续数分成一组,计算每组数量最少的,即为答案,6......
  • #分块,二分#洛谷 5356 [Ynoi2017] 由乃打扑克
    题目支持区间加和区间查询第\(k\)小分析分块之后给每个整块排序,这样修改的时候整块打标记,散块直接分开把需要加的部分暴力加之后归并,就是\(O(\sqrt{n})\)的查询的话,如果只有散块直接归并出结果,否则二分答案,加上小块合并成的整块,相当于是整体二分,就是\(O(\sqrt{n}\log{a_......
  • 洛谷题单指南-贪心-P4995 跳跳!
    原题链接:https://www.luogu.com.cn/problem/P4995题意解读:消耗最大的体力跳完所有石头,贪心选择问题。解题思路:贪心策略:每次保证有最大的高度差即可,第一次跳到最大高度然后跳到最小高度,再跳到剩下的最大高度,再跳第二小高度,以此类推,直到跳完所有石头。100分代码:#include<bi......
  • 洛谷题单指南-贪心-P1094 [NOIP2007 普及组] 纪念品分组
    原题链接:https://www.luogu.com.cn/problem/P1094题意解读:贪心选择解题思路:贪心策略:将纪念品按价格由小到大排序,优先选择价格大的一直到超过分组价格上限,再选择价格小的直到超过价格上限,此为一组重复以上过程,直到所有数据都遍历到,采用一头一尾双指针即可。证明:如果最大价格......
  • 洛谷 P4198 楼房重建(线段树上二分)
    传送门解题思路动态维护区间里面单调递增斜率的长度需要维护两个信息:上述长度,和区间最大值(合并时需要)难点在于两个子区间的合并。左区间的楼房一定都能看见(没有遮挡),所以要在右区间二分,找到左面最大值lmax在右区间的位置,然后进行合并。复杂度两个log。AC代码#include<ios......
  • 洛谷题单指南-贪心-P1208 [USACO1.3] 混合牛奶 Mixing Milk
    原题链接:https://www.luogu.com.cn/problem/P1208题意解读:就是一个部分背包问题,贪心模版题。解题思路:优先选择单价低的牛奶即可。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=5005;structfarmer{intprice,count;}f[N];boolcmp(fa......
  • 洛谷题单指南-贪心-P5019 [NOIP2018 提高组] 铺设道路
    原题链接:https://www.luogu.com.cn/problem/P5019题意解读:最短时间内填满道路,连在一起的不为0的坑可以一起填解题思路:方法1:分治法对于一段连续不同深度的坑,可以最多连续填的天数是最小深度在填满最小深度之后,分别针对其左边和右边的区域再进行填充,这就是此题分治法的理论基......
  • 洛谷【算法1-3】暴力枚举
    P2241统计方形(数据加强版)-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintINF=0x3f3f3f3f;lln,m,z,c;signedmain(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin......