首页 > 其他分享 >每日一题-P1344

每日一题-P1344

时间:2024-07-23 17:59:58浏览次数:9  
标签:cnt 205 int ll P1344 一题 每日 hd dis

本来求边数又建了个图跑流,然后看题解发现直接流量置为A*w+1(A为足够大的数)

感觉很强

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int A=1e5;
const ll inf=1e18;
int n,m,s,t;
struct edge{
	int v;ll w;int nx;
}e[10005];
int cnt,hd[205],cur[205];
void add(int u,int v,ll w){
	e[++cnt]=edge{v,w,hd[u]};
	hd[u]=cnt;
}
int dis[205];
bool bfs(){
	queue<int> q;q.push(s);
	memset(dis,0x3f,sizeof(dis));dis[s]=0;
	for(int i=1;i<=n;i++)cur[i]=hd[i];
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=hd[u];i;i=e[i].nx){
			int v=e[i].v;if(e[i].w<=0 || dis[v]<=dis[u]+1)continue;
			dis[v]=dis[u]+1;
			q.push(v);
		}
	}
	return dis[t]!=0x3f3f3f3f;
}
inline int rev(int id){
	if(id&1)return id+1;
	else return id-1;
}
ll dfs(int u,ll sum){
	if(u==t)return sum;
	ll res=0;
	for(int i=cur[u];i;i=e[i].nx){
		cur[u]=i;
		int v=e[i].v;if(e[i].w<=0 || dis[v]!=dis[u]+1)continue;
		ll p=dfs(v,min(sum,e[i].w));
		if(p==0)dis[v]=0x3f3f3f3f;
		e[i].w-=p;e[rev(i)].w+=p;
		res+=p;sum-=p;
	}
	return res;
}
ll dinic(){
	ll res=0;
	while(bfs())res+=dfs(s,inf);
	return res;
}
int main(){
	scanf("%d%d",&n,&m);s=1,t=n;
	for(int i=1;i<=m;i++){
		int u,v;ll w;scanf("%d%d%lld",&u,&v,&w);
		add(u,v,w*A+1);add(v,u,0);
	}
	ll res=dinic();
	printf("%lld %lld\n",res/A,res%A);
	return 0;
}

标签:cnt,205,int,ll,P1344,一题,每日,hd,dis
From: https://www.cnblogs.com/kentsbk/p/18319187

相关文章

  • 单调栈(每日温度)
    每日温度https://leetcode.cn/problems/daily-temperatures/description/可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。正向遍历温度列表。对于温度列表中的每个元素temperatu......
  • 第四十八天 第十章 单调栈part01 739. 每日温度 496.下一个更大元素 I 503.下一个更大
     739.每日温度 使用单调栈:注意栈中的递增递减顺序。classSolution{public:vector<int>dailyTemperatures(vector<int>&temperatures){vector<int>res(temperatures.size(),0);stack<int>sta;sta.push(0);for(int......
  • 每日一题-P1263
    一眼匈牙利,没有紫啊#include<bits/stdc++.h>usingnamespacestd;#definepbpush_backintn,m,res,a[205][205],p[40005];intid1[205][205],fr1[40005],cnt1,id2[205][205],fr2[40005],cnt2;boolvis[40005];structedge{ intv,nx;}e[40005];intcnt,hd[40005];vo......
  • 每日一题:Leetcode-322 零钱兑换
    力扣题目解题思路java代码力扣题目:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例......
  • 每日一题:Leetocde-70 爬楼梯
    力扣题目解题思路java代码力扣题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输入:n=3输出:3解释:有......
  • 每日一题-P1261
    其实想到方法了,但是以为复杂度炸了,好蠢#include<bits/stdc++.h>usingnamespacestd;#definepbpush_backintn,m,rk[30005],f[30005],g[30005],dis[30005],ans;boolvis[30005];vector<int>s;structedge{ intv,w,nx;}e[300005];intcnt,hd[30005];voidadd(intu,......
  • 每日一题-P1251
    网络流24题~#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintinf=1e9;constlllnf=1e18;intN,p,m,f,n,s,r[2005],st,ed;structedge{ intv,nx;llw;intc;}e[40005];intcnt,hd[4105];voidadd(intu,intv,llw,intc){ e[++cnt......
  • 【Golang 面试基础题】每日 5 题(三)
    ✍个人博客:Pandaconda-CSDN博客......
  • 7月22号python 每日一题
    7月22号python每日一题LCR121.寻找目标值-二维数组难度:中等m*n的二维数组plants记录了园林景观的植物排布情况,具有以下特性:每行中,每棵植物的右侧相邻植物不矮于该植物;每列中,每棵植物的下侧相邻植物不矮于该植物。请判断plants中是否存在目标高度值target。示......
  • 每日一题之快乐数问题
    题目:题目链接:快乐数题解:方法一:哈希表首先就是何种情况下不是快乐数,那就是处理过的结果多次重复出现的情况,那这里就可以通过哈希表在每次循环中存储处理后的结果,如果处理后的结果在哈希表中查找的到说明结果重复说明该数不是快乐数,退出循环即可,否则一直循环到处理结果为1......