P1344 [USACO4.4]追查坏牛奶Pollutant Control(ISAP模板)

传送门
在这里插入图片描述
简单解释一下如何求割的边数(即车数);
思路一:先用ISAP在原图中求最小割(即代价),然后将原图中的边权改为1,再求最小割(车数);
思路二:因为m<=1000,所以将原图边权改为edge*mod+1(mod为大于1000的任何数),代价即为当前图下的最小割/mod,车数即为当前图下最小割%mod
(记得开long long)

#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=2001;
const int M=2e3+5;
const int N=4*1e6+5;//?????????? 4e8
int n,m,s,t;
struct node
{
	int ver,edge,next;
}e[N];
int gap[N],d[N];
int tot=1,head[N];
void add(int x,int y,int z)
{
	e[++tot].ver=y;
	e[tot].edge=z;
	e[tot].next=head[x];
	head[x]=tot;
}
void addedge(int x,int y,int z)
{
	add(x,y,z);add(y,x,0);
}
void bfs()
{
	queue < int > q;
	q.push(t);
	d[t]=gap[1]=1;
	while(q.size())
	{
		int x=q.front();q.pop();
		for(int i=head[x];i;i=e[i].next)
		{
			int y=e[i].ver;
			if(d[y])  continue;
			d[y]=d[x]+1;
			q.push(y);
			gap[d[y]]++; 
		}
	}
}
int dfs(int x,int flow)
{
	if(x==t)  return flow;
	int rest=0,k;
	for(int i=head[x];i;i=e[i].next)
	{
		int y=e[i].ver;
		int z=e[i].edge;
		if(!z)  continue;
		if(d[x]!=d[y]+1)  continue;
		k=dfs(y,min(z,flow-rest));
		if(k<=0)  continue;
		rest+=k;
		e[i].edge-=k;
		e[i^1].edge+=k;
		if(rest==flow)  return rest;
	}
	if(--gap[d[x]]==0)  d[s]=n+1;
	++gap[++d[x]];
	return rest;
}
int isap()
{
	int maxflow=0;
	bfs();
	while(d[s]<=n)  maxflow+=dfs(s,1<<30);
	return maxflow;
}
void solve()
{
	cin>>n>>m;
	s=1,t=n;
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		scanf("%lld%lld%lld",&x,&y,&z);
		addedge(x,y,z*mod+1);
	}
	int ans=isap();
	cout<<ans/mod<<" "<<ans%mod<<endl;
}
signed main()
{
//	ios::sync_with_stdio(false);
	solve();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 题目P1518 \[USACO2.4\] 两只塔姆沃斯牛是一道模拟题,题目要求判断Farmer John和两头牛是否会相遇。解题思路可以分为两种方法。一种方法是记录二者的状态,如果出现了与前面相同的状态则说明陷入了死循环。具体实现步骤可以使用数组来记录Farmer John和两头牛的坐标、方向等状态信息,然后判断是否出现了重复的状态。另一种方法是利用博弈的思想,如果二者会同时回到一种状态,那么说明他们不会再相遇了,因为这时候他们已经陷入了一种对称性的状态。通过判断是否存在一种线性关系,可以确定二者是否会相遇。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two](https://blog.csdn.net/TD123456q/article/details/125688037)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [洛谷P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two 题解 (C/C++)](https://blog.csdn.net/Jason__Jie/article/details/115027619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [(移动方向状态标志)P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two题解](https://blog.csdn.net/m0_57221330/article/details/119980758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值