社区讨论

Dinic 27分不知道哪里搞错了,可以只看建模部分其它应该没有问题

P7368 [USACO05NOV] Asteroids G参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lohxnwz4
此快照首次捕获于
2023/11/03 09:24
2 年前
此快照最后确认于
2023/11/03 14:08
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define MAXN 300005
#define INF 2147483647
#include<queue>
using namespace std;
template<typename T>inline void read(T&x) {
	char c=getchar();
	bool f=0;
	x=0;
	for(; !isdigit(c); c=getchar())f|=(c=='-');
	for(; isdigit(c); c=getchar())x=((x<<3)+(x<<1)+(c^48));
	x=f?-x:x;
}
template<typename T>inline void write(T x) {
	if(x<0)putchar('-'),x=-x;
	if(x>=10)write(x/10);
	putchar(x%10^48);
}

struct MaxFlow {
	struct edge {
		int ed,nxt,cap,flow;
	} e[MAXN<<8];
	int head[MAXN],cnt;

	long long maxflow=0;

	int cur[MAXN],dep[MAXN];

	int n,S,T;

	void initt() {
		cnt=0;
		memset(head,-1,sizeof (int)*(n+1));
	}

	void Add_Edge(int x,int y,int z) {
		e[cnt]= {y,head[x],z,0};
		head[x]=cnt++;
		e[cnt]= {x,head[y],0,0};
		head[y]=cnt++;
	}

	bool bfs() {
		memset(dep,0,sizeof (int)*(n+1));
		dep[S]=1;
		queue<int>q;
		q.push(S);
		while(!q.empty()) {
			int u=q.front();
			q.pop();
			for(int i=head[u]; ~i; i=e[i].nxt) {
				int v=e[i].ed;
				if((!dep[v])&&(e[i].cap>e[i].flow)) {
					dep[v]=dep[u]+1;
					q.push(v);
				}
			}
		}
		return dep[T];
	}

	int dfs(int x,int flow) {
		if((x==T)||(!flow))return flow;
		int ret=0;
		for(int& i=cur[x]; ~i; i=e[i].nxt) {
			int v=e[i].ed,d=0;
			if((dep[v]==dep[x]+1)&&(d=dfs(v,min(flow-ret,e[i].cap-e[i].flow)))) {
				ret+=d;
				e[i].flow+=d;
				e[i^1].flow-=d;
				if(flow==ret)return ret;
			}
		}
		return ret;
	}

	void Dinic() {
		while(bfs()) {
			memcpy(cur,head,sizeof (int)*(n+1));
			maxflow+=dfs(S,INF);
		}
	}

} mf;

int n,k;
void initt() {
	mf.initt();
	mf.T=n*2+10;
	mf.n=mf.T+10;
	mf.S=0;
	read(n),read(k);
	for(int i=1; i<=n; ++i) {
		mf.Add_Edge(mf.S,i,1);
		mf.Add_Edge(i+n,mf.T,1);
	}
	for(int i=1,x,y; i<=k; ++i) {
		read(x),read(y);
		mf.Add_Edge(x,y+n,INF);
	}
}
int main() {
	initt();
	mf.Dinic();
	write(mf.maxflow);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...