只过后四个点其他全WA 求调
查看原帖
只过后四个点其他全WA 求调
450705
__phiu楼主2023/10/24 20:59

rt

#include<bits/stdc++.h>
#define mp make_pair
#define For(i,a,b,c) for(int i=a;i<=b;i+=c)
#define Rof(i,a,b,c) for(int i=a;i>=b;i-=c)
#define pb push_back
#define pii pair<int,int>
using namespace std;
const int N = 2e6 + 50;
inline int read() {
	char c = getchar();
	int x = 0, f = 1;
	while (c<'0' or c>'9') {
		if (c == '-')
			f = -1;
		c = getchar();
	}
	while (c >= '0' and c <= '9')
		x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
	return x * f;
}
vector<pair<int ,int > >v[N];
int n,m,s,t;
long long c[N<<1];
int flag[5210][5210];
bool vis[N];
pair<int,int> pre[N<<1];
long long dis[N];
long long ans;
bool bfs(){
	queue<int>q;
	for(int i=1;i<=n;i++) vis[i]=0;
	q.push(s);
	vis[s]=1;
	dis[s]=1e18;
	while(!q.empty()){
		int p=q.front();
		q.pop();
		for(auto [to,i]:v[p]){
			if(c[i]==0) continue;
			if(vis[to]) continue;
			vis[to]=1;
			dis[to]=min(dis[p],c[i]);
			pre[to]=mp(p,i);
			q.push(to);
			if(to==t) return 1;
		}
	}
	return 0;
}
void update(){
#define X(x) x.first
#define Y(x) x.second
	int x=t;
	while(x!=s){
		pii p=pre[x];
		c[Y(p)]-=dis[t];
		c[Y(p)^1]+=dis[t];
		x=X(p);
	}
	ans+=dis[t];
	return ;
}
signed main() {
	n=read(),m=read();
	s=read(),t=read();
	for(int i=2;i<=m*2;i+=2){
		int x=read(),y=read(),z=read();
		if(!flag[x][y]){
			c[i]=c[i^1]=z;
			v[x].pb(mp(y,i));
			v[y].pb(mp(x,i^1));
			flag[x][y]=i;
		}
		else{
			int f=flag[x][y];
			c[f]+=z;
			c[f^1]+=z;
		}
	}
	while(bfs()!=0) update();
	printf("%lld",ans);
	return 0;
}
2023/10/24 20:59
加载中...