poj 1087 A Plug for UNIX

题目描述:
现在由你负责布置Internet联合组织首席执行官就职新闻发布会的会议室。
由于会议室修建时被设计成容纳全世界各地的新闻记者,因此会议室提供了多种电源插座用
以满足(会议室修建时期)各国不同插头的类型和电压。不幸的是,会议室是很多年前修建的,
那时新闻记者很少使用电子设备,所以会议室对每种插座只提供了一个。新闻发布会时,新闻记
者需要使用许多电子设备,如手提电脑,麦克风,录音机,传呼机等等。尽管这些设备很多可以
使用电池,但是由于发布会时间很长并且是单调乏味的,记者们希望能够使用尽可能多的设备(这
些设备需要使用插座),以打发时间。
在发布会之前,你收集了记者们使用的设备的信息,开始布置会议室。你注意到有些设备的
插头没有合适的插座可用。你怀疑这些设备来自那些在修建会议室时不存在的国家。对有些插座
来说,有多个设备的插头可以使用。而对另一些插座来说,没有哪些设备的插头可以用得上。
为了试图解决这个问题,你光顾了附近的商店,商店出售转换器,这些转换器可以将一种插
头转换成另一种插头。而且转换器可以串联。商店没有足够多的转换器类型,满足所有的插头和
插座的组合,但对于已有某种转换器,总是可以提供无限多个。

// 将所有设备看成源点
// 每当有 设备 插头 : dev1 plui 那么 cap[s][plui]++
// 然后将n个插头连向汇点 流量为1
// 对于转换器 对于 每个 plugi plugj cap[plugi][plugj]=INF
// 把图画出来就清楚了

// 求出最大流就是被使用的插座数

#include <iostream> #include <algorithm> #include <queue> #include <stack> #include <map> #include <math.h> #include <stdio.h> #include <string.h> #include <string> using namespace std; #define MOD 1000000007 #define INF 1000000000 #define maxn 520 #define maxm 48010 #define LL __int64//long long int M,K,C,N; int cap[maxn][maxn],flow[maxn][maxn]; int level[maxn]; bool BFS(int s,int t){ memset(level,0,sizeof(level)); queue<int> Q; int u; int i; Q.push(s); level[s]=1; while(!Q.empty()){ u=Q.front(); Q.pop(); if(u==t) return true; for(i=1;i<=t;i++) if(!level[i]&&cap[u][i]>flow[u][i]) { level[i]=level[u]+1; Q.push(i); } } return false; } int dfs(int u,int maxf,int t){ if(u==t||maxf==0) return maxf; int ret=0,f,i; for(i=1;i<=t;i++) if(cap[u][i]>flow[u][i]&&level[u]+1==level[i]){ f= dfs(i,min(maxf,cap[u][i]-flow[u][i]),t); flow[u][i]+=f; flow[i][u]-=f; maxf-=f; ret+=f; if(maxf==0) break; } return ret; } int Dinic(int s,int t){ int flow=0; while(BFS(s,t)){ flow+=dfs(s,INF,t); } return flow; } void init(){ memset(cap,0,sizeof(cap)); memset(flow,0,sizeof(flow)); } char s1[30],s2[30]; int main(){ int T; int i,j,k; int n,m,nu=0; // scanf("%d",&T); // while(T--){ map<string,int> mp; map<string,int>::iterator it; init(); scanf("%d",&n); // T=n; for(i=1;i<=n;i++){ scanf("%s",s1); it=mp.find(s1); if(it==mp.end()) mp[s1]=++nu; } n=nu;//printf("%d ",n); scanf("%d",&m); for(i=1;i<=m;i++){ scanf("%s %s",s1,s2); it=mp.find(s2); if(it!=mp.end()){ j=mp[s2]; cap[0][j]++; }else{ mp[s2]=++nu; cap[0][nu]++; } } scanf("%d",&k); while(k--){ scanf("%s %s",s1,s2); it=mp.find(s1); if(it==mp.end()) mp[s1]=++nu; it=mp.find(s2); if(it==mp.end()) mp[s2]=++nu; i=mp[s1]; j=mp[s2]; cap[i][j]=INF; } // printf("?"); for(i=1;i<=n;i++) cap[i][nu+1]=1; printf("%d\n",m-Dinic(0,nu+1)); // } return 0; }

 

你可能感兴趣的:(unix)