poj 1087 最大流

没啥好说的,慢慢建图

 

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台不同的机器需要m种插头,有k组转换:插头A能由插头B转换而来。问这些机器最少有几台不能插上插座。

  1 #include<cstdio>

  2 #include<iostream>

  3 #include<algorithm>

  4 #include<cstring>

  5 #include<cmath>

  6 #include<queue>

  7 #include<map>

  8 using namespace std;

  9 const int MAXN=500;

 10 const int INF=0x3fffffff;

 11 int g[MAXN][MAXN];//存边的容量,没有边的初始化为0

 12 int path[MAXN],flow[MAXN],start,end;

 13 int n;//点的个数,编号0-n.n包括了源点和汇点。

 14 queue<int>q;

 15 int bfs()

 16 {

 17     int i,t;

 18     while(!q.empty())q.pop();//把清空队列

 19     memset(path,-1,sizeof(path));//每次搜索前都把路径初始化成-1

 20     path[start]=0;

 21     flow[start]=INF;//源点可以有无穷的流流进

 22     q.push(start);

 23     while(!q.empty())

 24     {

 25         t=q.front();

 26         q.pop();

 27         if(t==end)break;

 28         //枚举所有的点,如果点的编号起始点有变化可以改这里

 29         for(i=0;i<=n;i++)

 30         {

 31             if(i!=start&&path[i]==-1&&g[t][i])

 32             {

 33                 flow[i]=flow[t]<g[t][i]?flow[t]:g[t][i];

 34                 q.push(i);

 35                 path[i]=t;

 36             }

 37         }

 38     }

 39     if(path[end]==-1)return -1;//即找不到汇点上去了。找不到增广路径了

 40     return flow[end];

 41 }

 42 int Edmonds_Karp()

 43 {

 44     int max_flow=0;

 45     int step,now,pre;

 46     while((step=bfs())!=-1)

 47     {

 48         max_flow+=step;

 49         now=end;

 50         while(now!=start)

 51         {

 52             pre=path[now];

 53             g[pre][now]-=step;

 54             g[now][pre]+=step;

 55             now=pre;

 56         }

 57     }

 58     return max_flow;

 59 }

 60 

 61 map<string,int> hash;

 62 int main()

 63 {

 64     int i,j,k,m;

 65     //freopen("1.in","r",stdin);

 66     while(scanf("%d",&n)!=EOF)

 67     {

 68         hash.clear();

 69         memset(g,0,sizeof(g));

 70         string s1,s2,s3;

 71         start=0;

 72         end=1;

 73         int tot=2;

 74         while(n--)

 75         {

 76             cin>>s1;

 77             hash[s1]=tot;

 78             g[0][hash[s1]]=1;

 79             tot++;

 80         }

 81         scanf("%d",&m);

 82         for(i=0;i<m;i++)

 83         {

 84             cin>>s1>>s2;

 85             if(hash[s1]==0) hash[s1]=tot++;

 86             if(hash[s2]==0) hash[s2]=tot++;

 87             g[hash[s1]][end]=1;

 88             g[hash[s2]][hash[s1]]=1;

 89         }

 90         scanf("%d",&k);

 91         while(k--)

 92         {

 93             cin>>s1>>s2;

 94             if(hash[s1]==0) hash[s1]=tot++;

 95             if(hash[s2]==0) hash[s2]=tot++;

 96             g[hash[s2]][hash[s1]]=INF;

 97         }

 98         n=tot-1;    //总点数

 99         printf("%d\n",m-Edmonds_Karp());

100     }

101     return 0;

102 }

 

你可能感兴趣的:(poj)