这题不必要对字母进行处理吧
查看原帖
这题不必要对字母进行处理吧
90562
我要考北大楼主2021/4/6 21:45

因为可以把字母的ASCLL码当作节点编号

#include<bits/stdc++.h>
#define r read()
#define log(a) cerr<<"\033[32m[DEBUG] "<<#a<<'='<<(a)<<" @ line "<<__LINE__<<"\033[0m"<<endl
#define bb printf("!!\n");
#define cc printf("\n");
using namespace std;
inline int read()
{
	bool ok=0 ;int res=0;char c;
	while(((c=getchar())<'0'||c>'9')&&c!='-');
	if(c=='-') ok=1;else res=c-48;
	while((c=getchar())>='0'&&c<='9')res=(res<<3)+(res<<1)+(c-48);
	return ok ? ~res + 1:res;
}
const int N=4e5,M=4e5;
int h[N],net[M],go[M],val[M],dep[N],ecnt=1,cap[M];
void add(int u,int v,int w){go[++ecnt]=v;cap[ecnt]=w;net[ecnt]=h[u];h[u]=ecnt;swap(u,v);go[++ecnt]=v;cap[ecnt]=0;net[ecnt]=h[u];h[u]=ecnt;}
int s,t,n,m;

int bfs()
{
	memset(dep,0,sizeof(dep));
	queue<int>q;
	q.push(s);
	dep[s]=1;
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int e=h[u];e;e=net[e])
		{
			int v=go[e];
			if(!dep[v]&&cap[e])
			{
				dep[v]=dep[u]+1;
				q.push(v);
			}
		}
	}
	return dep[t];
}
int dfs(int u,int flow)
{
	if(u==t)return flow;
	
	int res=0,tot=0;
	for(int e=h[u];e;e=net[e])
	{
		int v=go[e];
		if(dep[v]==dep[u]+1&&cap[e])
		{
			res=dfs(v,min(flow,cap[e]));
			tot+=res;
			
			cap[e]-=res;
			cap[e^1]+=res;
			flow-=res;
		}
	}
	if(tot==0)dep[u]=0;
	return tot;
}
int main()
{
 #ifndef ONLINE_JUDGE
	freopen("cin.txt","r",stdin);
//	freopen("cout.txt","w",stdout);
	#endif
	n=r;
	s='A';t='Z';
	char a,b;
	for(int i=1,w;i<=n;i++)
	{
		cin>>a>>b>>w;
		add(a,b,w);
	}

	int ans=0;
	while(bfs())
	{
		ans+=dfs(s,1e9);
	}
	printf("%d\n",ans);
	return 0;
}
2021/4/6 21:45
加载中...