MnZn求助网络流题目
查看原帖
MnZn求助网络流题目
107154
daduoli楼主2023/5/12 08:30

88分最后一个点过不去

#include<bits/stdc++.h>
typedef long long LL;

using namespace std;
const int MAXN=2e6+10;
const LL inf=1e15;
int n,m,S,T; 
struct daduoli {
	int f,t;
	LL c;
}que[MAXN*2];
int cnt=1,h[MAXN];
void add(int f,int t,LL c) {
	que[++cnt].f=h[f];
	que[cnt].t=t;
	que[cnt].c=c;
	h[f]=cnt;
}
void adline(int f,int t,LL c) {
	add(f,t,c);
	add(t,f,0);
}
int cur[MAXN],dis[MAXN];
bool bfs() {
	for(int i=1;i<=T;++i) {
		cur[i]=h[i];
		dis[i]=-2;
	}
	queue<int> q;
	q.push(S);
	dis[S]=1;
	while(!q.empty()) {
		int u=q.front();
		q.pop();
		for(int i=h[u];i;i=que[i].f) {
			int t=que[i].t;
			if(que[i].c&&dis[t]==-2) {
				dis[t]=dis[u]+1;
				if(t==T) return 1;
				q.push(t);
			}
		} 
	}
	return 0;
}
LL dinic(int node,LL flow) {
	if(node==T) return flow;
	LL res=0,k=0;
	for(int i=cur[node];i&&flow;i=que[i].f) {
		int t=que[i].t;
		cur[node]=i;
		if(dis[node]+1!=dis[t]||!que[i].c) continue;
		k=dinic(t,min(flow,que[i].c));
		if(!k) dis[t]=-2;
		res+=k;
		flow-=k;
		que[i].c-=k;
		que[(i^1)].c+=k;
	}
	return res;
}
int p[MAXN];
struct ddl {
	int f,t,c;
}a[MAXN];
signed main () {
	scanf("%d%d",&n,&m);
	S=1;
	T=n;
	for(int i=1;i<=m;++i) {
		scanf("%d%d%d",&a[i].f,&a[i].t,&a[i].c);
		p[i]=cnt+1;
		adline(a[i].f,a[i].t,a[i].c);
	}
	int ans=0;
	while(bfs()) ans+=dinic(S,inf);
	
	cout<<ans<<' ';
	for(int i=1;i<=100000;++i) h[i]=0;
	memset(que,0,sizeof(que));
	
	for(int i=1;i<=m;++i) {
		if(!que[p[i]].c) {
			adline(a[i].f,a[i].t,1);
		}
		else adline(a[i].f,a[i].t,inf);
	}
	ans=0;
	while(bfs()) ans+=dinic(S,inf);
	cout<<ans;
    return 0; 
} 
2023/5/12 08:30
加载中...