DinicWA了7,8,9,10,求助
查看原帖
DinicWA了7,8,9,10,求助
243737
YBT_mail楼主2020/8/27 08:41
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
struct Edge{
	int from,to,cap,flow;
	Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}
}; 
int n,m,s,t;
vector <Edge> edges;
vector <int> G[10003];
int d[1003],cur[1003],mm;
bool vis[1003];
void add(int from,int to,int cap){
	edges.push_back(Edge(from,to,cap,0));
	edges.push_back(Edge(to,from,0,0));
	mm=edges.size();
	G[from].push_back(mm-2);
	G[to].push_back(mm-1);
}
bool bfs(){
	memset(vis,0,sizeof(vis));
	queue<int> Q;
	Q.push(s);
	d[s]=0;
	vis[s]=1;
	while(!Q.empty()){
		int x=Q.front();Q.pop();
		for(int i=0;i<G[x].size();i++){
			Edge& e=edges[G[x][i]];
			if(!vis[e.to]&&e.cap>e.flow){
				vis[e.to]=1;
				d[e.to]=d[x]+1;
				Q.push(e.to);
			}
		} 
	}
	return vis[t];
}
int dfs(int x,int a){
	if(x==t||a==0) return a;
	int flow=0,f;
	for(int& i=cur[x];i<G[x].size();i++){
		Edge& e=edges[G[x][i]];
		if(d[x]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0){
			e.flow+=f;
			edges[G[x][i]^1].flow-=f;
			flow+=f;
			a-=f;
			if(a==0) break;
		}
	}
	return flow;
}
int Maxflow(int ss,int tt){
	s=ss,t=tt;
	int flow=0;
	while(bfs()){
		memset(cur,0,sizeof(cur));
		flow+=dfs(s,100000000);
	}
	return flow;
}
int main(){
	int ss,tt,x,y,c;
    cin>>n>>m>>ss>>tt;
    for(int i=1;i<=m;i++){
         scanf("%d%d%d",&x,&y,&c);
         add(x,y,c);
	}
    cout<<Maxflow(ss,tt);
	return 0;
} 
2020/8/27 08:41
加载中...