社区讨论
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 条回复,欢迎继续交流。
正在加载回复...