Description
Input
Output
Sample Input
4 A B C D 5 laptop B phone C pager B clock B comb X 3 B X X A X D
Sample Output
1
题意:有n个插座,m个用电器,每个用电器有一个专用插座,又有一些转换口,可以插座 x转换成y,只能单向转换,比如 B X ,
意思为X可以转换为B,
简单的最大流问题,将所有插座与源点建边流量为1,将左右用电器与汇点建边,流量为1 ,转换口之间建边流量为INF,
求源点到汇点最大流maxflow,结果ans=m-maxflow;
ac代码:
#include <iostream> #include <string.h> #include <stdio.h> #include <map> #include <string> #include <stdlib.h> using namespace std; const int MAXN=10110; const int MAXM=400011; const int INF=0x3f3f3f3f; struct Node { int to,next,cap; }edge[MAXM]; int tol;int head[MAXN]; int gap[MAXN],dis[MAXN],pre[MAXN],cur[MAXN]; void init() { tol=0; memset(head,-1,sizeof(head)); } void addedge(int u,int v,int w,int rw=0) { edge[tol].to=v;edge[tol].cap=w;edge[tol].next=head[u];head[u]=tol++; edge[tol].to=u;edge[tol].cap=rw;edge[tol].next=head[v];head[v]=tol++; } int sap(int start,int end0,int nodenum) { memset(dis,0,sizeof(dis)); memset(gap,0,sizeof(gap)); memcpy(cur,head,sizeof(head)); int u=pre[start]=start,maxflow=0,aug=-1; gap[0]=nodenum; while(dis[start]<nodenum) { loop: for(int &i=cur[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(edge[i].cap&&dis[u]==dis[v]+1) { if(aug==-1||aug>edge[i].cap) aug=edge[i].cap; pre[v]=u; u=v; if(v==end0) { maxflow+=aug; for(u=pre[u];v!=start;v=u,u=pre[u]) { edge[cur[u]].cap-=aug; edge[cur[u]^1].cap+=aug; } aug=-1; } goto loop; } } int mindis=nodenum; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(edge[i].cap&&mindis>dis[v]) { cur[u]=i; mindis=dis[v]; } } if((--gap[dis[u]])==0)break; gap[dis[u]=mindis+1]++; u=pre[u]; } return maxflow; } map<string,int>Map; int main() { int n,m,k; char str[30],str1[30]; int S,T; while(~scanf("%d",&n)) { init(); Map.clear(); S=0; for(int i=1;i<=n;i++) { scanf("%s",str); Map[str]=i; addedge(S,i,1); } scanf("%d",&m); T=800; int p=n; for(int i=1;i<=m;i++) { scanf("%s%s",str,str1); Map[str]=++p; addedge(Map[str],T,1); if(!Map[str1]) Map[str1]=++p; addedge(Map[str1],Map[str],1); } scanf("%d",&k); for(int i=1;i<=k;i++) { scanf("%s%s",str,str1); if(!Map[str]) Map[str]=++p; if(!Map[str1]) Map[str1]=++p; addedge(Map[str1],Map[str],INF); } int ans=sap(S,T,T); cout<<m-ans<<endl; } return 0; }