蒟蒻最大流板题求调,只有20分,其他WA.
查看原帖
蒟蒻最大流板题求调,只有20分,其他WA.
306545
Travller楼主2022/12/4 15:46
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
inline int read(){
	int w=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		w=w*10+ch-'0';
		ch=getchar();
	}
	return w*f;
}
const int inf=0x7fffffff;
int n,m,s,t;
int incf[30],pre[30];
bool v[30];
long long maxflow;
int tot=1,nxt[1405],head[705],edge[1405],ver[1405];
void add(int u,int v,int w){
	nxt[++tot]=head[u],ver[tot]=v,edge[tot]=w,head[u]=tot;
	nxt[++tot]=head[v],ver[tot]=u,edge[tot]=0,head[v]=tot;
}
bool bfs(){
	memset(v,0,sizeof(v));
	queue<int> q;
	q.push(s);v[s]=1;
	incf[s]=inf;
	while(q.size()){
		int x=q.front();q.pop();
		for(int i=head[x];i;i=nxt[i]){
			if(edge[i]){
				int y=ver[i];
				if(v[y]) continue;
				incf[y]=min(incf[x],edge[i]);
				pre[y]=i;
				q.push(y),v[y]=1;
				if(y==t) return 1; 
			}
		}
	}
	return false;
}
void update(){
	int x=t;
	while(x!=s){
		int i=pre[x];
		edge[i]-=incf[t];
		edge[i^1]+=incf[t];
		x=ver[i^1]; 
	}
	maxflow+=incf[t];
} 
int dot(char c){
	if(c>='A'&&c<='Z') return c-'A'+1;
	return c-'a'+1; 
}
int main(){
	m=read();
	for(int i=1;i<=m;i++){
		char u,v;
		cin>>u>>v;
		int w=read();
		add(dot(u),dot(v),w);
	}
	s=1,t=26;
	while(bfs()) update();
	cout<<maxflow;
	return 0;
}
2022/12/4 15:46
加载中...