UVA, 753 A Plug for UNIX

来源:互联网 发布:试验数据分析 编辑:程序博客网 时间:2024/04/29 19:31
题意: 
4 4个插座,下面是名称,不一定时单字母,可能是字符串 




5 5个设备,名称 插头 
laptop B 
phone C 
pager B 
clock B 
comb X 
3 3种转换器 ,个数无限 
B X 
X A 
X D 
问最少设备不能使用的数量 

建立最大流,超级源点连接所有的设备,超级终点连接所有的插座,设备插座之间借转换器(个数无限,容量设置INF),其他的容量设置为1


#include <iostream>#include<vector>#include<string>#include<cstring>#include<map>using namespace std;#define N 505#define INF 9999999struct edge{    int to,cap,rev;    edge(int a,int b,int c)    {        to=a;        cap=b;        rev=c;    }};vector<edge>v[N];map<string,int>ma;void add_edge(int from,int to,int cap);int dfs(int a,int t,int f);int max_flow(int s,int t);int used[N];int main(){    int t;    cin>>t;    int first=0;    while(t--)    {        int k=1;        for(int i=0;i<=N;i++)        {            v[i].clear();        }        ma.clear();        int n,m,r;        string s,c;        if(first)            cout<<endl;        first++;      cin>>n;      for(int i=0;i<n;i++)      {          cin>>s;          if(ma[s])          add_edge(0,ma[s],1);          else            {                ma[s]=k;                add_edge(0,ma[s],1);                k++;            }      }      cin>>m;      for(int i=0;i<m;i++)      {          cin>>c>>s;          if(ma[s])          add_edge(ma[s],499,1);          else          {              ma[s]=k;              add_edge(ma[s],499,1);              k++;          }      }      cin>>r;      for(int i=0;i<r;i++)      {          cin>>s>>c;          if(!ma[s])          {              ma[s]=k;              k++;          }          if(!ma[c])          {              ma[c]=k;              k++;          }          add_edge(ma[c],ma[s],INF);      }      int ans=max_flow(0,499);      cout<<m-ans<<endl;    }    return 0;}void add_edge(int from,int to,int cap){    v[from].push_back(edge(to,cap,v[to].size()));    v[to].push_back(edge(from,0,v[from].size()-1));}int dfs(int a,int t,int f){    if(a==t)        return f;    used[a]=1;    for(int i=0;i<v[a].size();i++)    {        edge &e=v[a][i];        if(!used[e.to]&&e.cap>0)        {            int d=dfs(e.to,t,min(f,e.cap));            if(d>0)            {                e.cap-=d;                v[e.to][e.rev].cap+=d;                return d;            }        }    }    return 0;}int max_flow(int s,int t){    int flow=0;    while(1)    {        memset(used,0,sizeof(used));        int f=dfs(s,t,INF);        if(f==0)            return flow;        flow+=f;    }}


0 0
原创粉丝点击