首页 > 其他分享 >POJ 1149 PIGS

POJ 1149 PIGS

时间:2023-02-22 00:22:53浏览次数:68  
标签:nxt int 1149 PIGS POJ go now hd dis

    https://vjudge.net/problem/POJ-1149

 

#include <iostream>
#include<queue> 
#include <cstring>
#define IOS std::ios::sync_with_stdio(0)
using namespace std;
 const int N =1000,M=5e5+100;
#define int long long 

 const int inf =1e9;
 int R[N],a[N];
 int all=1,hd[N],go[M],w[M],nxt[M];
 
 int S,T,n,m;
 int dis[M],ans=0,now[M];
 
 void add_(int x,int y,int z){
 	nxt[++all]=hd[x]; hd[x]=all; go[all]=y;
 	w[all]=z;
 	swap(x,y);
 	nxt[++all]=hd[x]; hd[x]=all; go[all]=y;
 	w[all]=0;
 }
  bool bfs(){
 	for(int i=1;i<=n+m+3;i++)dis[i]=inf;
 	queue<int> q;
 	q.push(S);
 	now[S]=hd[S];
 	dis[S]=0;
 	
 	while(q.empty()==0){
 		int x=q.front(); 
 		q.pop();
 		for(int i=hd[x];i;i=nxt[i]){
 			int y=go[i];
 			if(w[i]>0&&dis[y]==inf){
 				dis[y]=dis[x]+1;
 				now[y]=hd[y];
	 			q.push(y);
	 			if(y==T) return 1;
 			}
 		}
 	}
 	return 0;
 }
 int dfs(int x,int sum){
 	if(x==T) return sum;
 	int k,res=0;
 	
 	for(int i=now[x];i&∑i=nxt[i]){
 		now[x]=i;
 		int y=go[i]; 
 		if(w[i]>0&&(dis[y]==dis[x]+1)){
 			k=dfs(y,min(sum,w[i]));
 			if(k==0) dis[y]=inf;
 			w[i]-=k;
 			w[i^1]+=k;
 			res+=k;
 			sum-=k;
 		}
 	}
 	return res;
 }
 
 signed main(){
 	IOS;
 	int i,x,y,z;
 	cin>>n>>m>>S>>T;
 	for(i=1;i<=m;i++){
 		cin>>x>>y>>z; add_(x,y,z); 
 	}
 	int ans=0;
	while(bfs()) ans+=dfs(S,inf);
	cout<<ans<<endl;
 }
 
 
 

 

标签:nxt,int,1149,PIGS,POJ,go,now,hd,dis
From: https://www.cnblogs.com/towboa/p/17142995.html

相关文章

  • POJ 2506 Tiling 递推+大数
    将答案存在ret数组里面n=0的时候居然是1递推关系ret[i]=ret[i-1]+ret[i-2]*2;注意是乘2不是3,当ret[i-2]时候,我们有两个单位可以操作,因为全竖起来的那种,在ret[......
  • POJ 1001 Exponentiation 字符串乘法+快速求幂
    考虑一下下面的样例应该可以AC:底数整数的情况去掉最后后导零没有小数部分时候不输出小数点思路先不考虑小数点将数存入字符串a,b中答案存入retret的长度是a的长......
  • POJ 1050 To the Max 矩阵最大和的子数组:动态规划
    将原来的矩阵直接改造成dp矩阵dp[i][j]表示以以a[0][0]为左上角a[i][j]为右下角的矩阵之和所以一个O(n......
  • POJ 1088 滑雪 递归+dp | 拓扑排序
    从每个点(i,j)向四个方向去看如果某一个方向(a,b)的数值比当前位置小先求解(a,b)的最长距离,之后加1即可朴素的递归重复求解了很多子问题,我们每计算出一个子问题的解,便......
  • POJ 1636 Prison rearrangement 二部图连通分量+背包
    以第三组为例,我们根据输入可以得到这个二部图根据不能放在一起的情况可以得到这样的连通分量对于每一个连通分量,我们将这个连通分量按照监狱分为两个部分这两个部分调整的......
  • POJ 2228 Naptime 环形DP
    先不考虑环的情况dp[i][j][0]:前i个时间间隔中,已经花费了j个间隔,取得的最大值,并且第i个间隔在休息dp[i][j][1]:前i个时间间隔中,已经花费了j个间隔,取得的最大值,并且第i个间......
  • [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
    题目vjudgeURL:​​CountingDivisors(square)​​​Letbethenumberofpositivedivisorsof.Forexample,,and.LetGiven,find.InputFirstlinecontains......
  • POJ 3345 Bribing FIPA
      #include<iostream>#include<map>#include<algorithm>#include<cstring>usingnamespacestd;constintN=203,M=N;typedeflonglongll;intn......
  • poj 2230
    求一个无向图的欧拉回路,但要求每条边正反过一次 当作有向图,打标记只打一条边 #include<iostream>#include<algorithm>#include<cstring>#include<stack>usi......
  • POJ - 1664 放苹果
    把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1是同一种分法。Input第一行是测试数据的数目t(0<=t<=20)。以下每行均包......