uva753 (建图 & 最大流)
来源:互联网 发布:图像测量软件 编辑:程序博客网 时间:2024/05/29 02:59
题目大意:
有n个插座,并有大写字母表示插座的类型。
有m个电器,给出电器的名称以及电器适合的插座类型。
有k个转换器,给出入口类型以及转换后插座的类型。
求最后有几个电器无法插入插座中。
思路:
建图。
建立一个超级源点,超级源点到设备的容量为1,如果有重复的要+上,设备与设备所用的插座之间有一条边,容量也为1,如果有重复的也要+上,转换器的插座与插座之间的容量是INF,因为转换器可以有无数个,然后建立插座到汇点的边,容量为1,如果有重复的也加上。
代码:
#include <iostream>using namespace std;#include <cstring>#include <stdio.h>#include <queue>#include <map>const int MAXN = 310;const int INF = 0x3f3f3f3f;string str;int m,n,k;map<string,int> rs,dv;int mr[MAXN],p[MAXN],c[MAXN][MAXN],f[MAXN][MAXN];int maxFlow(int s,int t ,int num) { queue<int> q; memset(p,0,sizeof(p)); memset(f,0,sizeof(f)); int F = 0; while(1) { memset(mr,0,sizeof(mr)); q.push(s); mr[s] = INF; while(!q.empty()) { int u = q.front(); q.pop(); for(int v = 0; v < num; v++) { if(!mr[v] && c[u][v] > f[u][v]) { p[v] = u; q.push(v); mr[v] = min(mr[u],c[u][v] - f[u][v]); } } } if(mr[t] == 0) return F; for(int i = t; i != s; i = p[i]) { f[p[i]][i] += mr[t]; f[i][p[i]] -= mr[t]; } F += mr[t]; }}int main() { int T; int did,rid; int adt; scanf("%d",&T); while(T--) { rs.clear(); dv.clear(); scanf("%d",&n); memset(c,0,sizeof(c)); for(int i = 1; i <= n; i++) { cin >> str; rs[str] = i;//记录插座的编号 } adt = 0; scanf("%d",&m); for(int i = 1; i <= m; i++) { cin >> str; if((did = dv[str]) == 0) {//如果这个设备没有出现过的化 那么给它一个编号 did = (dv[str] = i); } c[0][did] += 1;//建立超级源点到设备之间的边容量为1 cin >> str; if((rid = rs[str]) == 0) {//如果这个插座名称前面没有的话,那么就加到n个插座后面 adt++; rid = (rs[str] = n + adt); } c[did][rid + m] += 1;//建立设备与其适用的插座之间的边,容量为1 } for(int i = m + 1; i <= m + n; i++) //这里一定是要 i <= m + n 不可以小于m + n + adt 因为最后肯定要经过给出的插座插上电的 而adt是多出来的插座必须通过转换器获得 c[i][m + n + 1 + adt] += 1;//建立超级汇点 scanf("%d",&k); for(int i = 1; i <= k; i++) { cin >> str; rid = rs[str]; cin >> str; c[m + rid][m + rs[str]] += INF;//建立转换器之间的边 } int ans = maxFlow(0,m + n + 1 + adt,m + n + 2 + adt);//算出最大流,表示最多有几个设备可以插上插座 printf("%d\n",m - ans); if(T) printf("\n"); } return 0;}
0 0
- uva753 (建图 & 最大流)
- uva753最大流
- uva753(最大流)
- [最大流法二分匹配]uva753
- Uva753
- uva753
- UVa753/POJ1087_A Plug for UNIX(网络流最大流)(小白书图论专题)
- uva753 - A Plug for UNIX 网络流 插头匹配
- uva753 folyd EK算法
- UVa753 A Plug for UNIX
- uva753(一般图匹配)
- poj1149PIGS(最大流+建图)
- hdu3572 建图 最大流
- 最大流-最大利益
- poj 1149 建图+最大流
- poj3281-Dining ,最大流,建图
- POJ 3281 最大流+建图
- 最大流
- EL表达式
- 谨记细心,避免误操作,第一次误操作也希望是最后一次
- C++ 标识符
- 【bzoj3998】[TJOI2015]弦论
- 数据库设计三大范式
- uva753 (建图 & 最大流)
- CSS之弧形阴影
- MVC
- soledede--期望最大化(EM)算法
- How to Set JAVA_HOME / PATH variables Under Linux Bash Profile
- vb.net 删除数据库内容
- 第三周上机实践项目 项目4--换分币
- HDU2089 不要62(数位dp入门)
- 立即调用的函数表达式(IIFE)