博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 753(最大流)
阅读量:6378 次
发布时间:2019-06-23

本文共 2267 字,大约阅读时间需要 7 分钟。

题意:有若干个电器设备需要不同的适配器才能接上电源,现在你要让尽可能多的电气设备接上电源。首先你手中有n个适配器和适配器的型号,再告诉你有m个电器和他们分别对应的适配器的型号,最后还有一个商店提供买不同型号的适配器转换器,转换是单向的A B表示能把A接口转换成B接口(就是原来需要用A适配器的现在可以用B适配器当然也可以用原来的不变)超市提供的转换器数量是没有限制的,可以无限买。

思路:这道题很容易就转化为最大流问题首先一个源点连接不同的电器流量为1,不同的电器根据需要连上不同的适配器流量也为1,再根据不同适配器中能转换建立流量为INF的单向边,再根据每个每个适配器拥有的数量从没个适配器连接一条流量为其数量的边至汇点。这样图就建完了,接下来是EK算法解决问题。

代码如下:

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #define LEN 510 10 #define INF 0x3f3f3f3f 11 #define ll long long 12 #define eps 1e-6 13 14 using namespace std; 15 16 int n, m, k, tn, tm, tk, cap[LEN][LEN]; 17 char rec[LEN][51], di[LEN][51], numr[LEN]; 18 19 void init(){ 20 tn = tm = tk = 0; 21 memset(numr, 0, sizeof numr); 22 memset(cap, 0, sizeof cap); 23 } 24 25 int ji(char str[]){ 26 for(int i=0; i
q; 36 memset(flow, 0, sizeof flow); 37 f = 0; 38 while(1){ 39 memset(a, 0, sizeof a); 40 a[s] = INF; 41 q.push(s); 42 while(!q.empty()){ 43 int u = q.front(); q.pop(); 44 for(int v=0; v
flow[u][v]){ 46 p[v] = u; 47 q.push(v); 48 a[v] = min(a[u], cap[u][v]-flow[u][v]); 49 } 50 } 51 } 52 if(a[t] == 0)break; 53 for(int u=t; u!=s; u = p[u]){ 54 flow[p[u]][u]+=a[t]; 55 flow[u][p[u]]-=a[t]; 56 } 57 f+=a[t]; 58 } 59 return f; 60 } 61 62 int main() 63 { 64 // freopen("in.txt", "r", stdin); 65 66 int T; 67 char str[51], sstr[51]; 68 scanf("%d", &T); 69 while(T--){ 70 init(); 71 scanf("%d", &n); 72 for(int i=1; i<=n ;i++){ 73 scanf("%s", str); 74 int pos = ji(str); 75 if(pos==-1){ 76 strcpy(rec[tn], str); 77 numr[tn++] = 1; 78 } 79 else numr[pos] ++; 80 } 81 scanf("%d", &m); 82 for(int i=1; i<=m; i++){ 83 scanf("%s%s", di[i], str); 84 int pos = ji(str); 85 if(pos == -1){ 86 pos = tn; 87 strcpy(rec[tn], str); 88 numr[tn++] = 0; 89 } 90 cap[0][i] = 1; 91 cap[i][m+1+pos] = 1; 92 } 93 scanf("%d", &k); 94 for(int i=1; i<=k; i++){ 95 scanf("%s%s", str, sstr); 96 if(ji(str)==-1){ 97 strcpy(rec[tn], str); 98 numr[tn++] = 0; 99 }100 if(ji(sstr)==-1){101 strcpy(rec[tn], sstr);102 numr[tn++] = 0;103 }104 // cout << str << " -> " << sstr << endl;105 cap[m+1+ji(str)][m+1+ji(sstr)] = INF;106 }107 for(int i=0; i
View Code

 

转载于:https://www.cnblogs.com/shu-xiaohao/p/3476879.html

你可能感兴趣的文章
Java使用Try with resources自动关闭资源
查看>>
china-pub十一周年庆,多重优惠隆重登场,千万别错过哟!
查看>>
HDU 3068 最长回文(manacher算法)
查看>>
二叉树
查看>>
手把手教你如何安装水晶易表——靠谱的安装教程
查看>>
Python单例模式(Singleton)的N种实现
查看>>
221. Maximal Square
查看>>
MySQL基础
查看>>
LeetCode35.搜索插入位置 JavaScript
查看>>
5个让人赞不绝口的微信小程序,拒绝占用手机内存!
查看>>
Spring Security整合KeyCloak保护Rest API
查看>>
POS概述
查看>>
containerd发布了CRI修复程序和CVE-2019-5736更新的runc
查看>>
WEB前端开发的思考与感悟
查看>>
微信自动跳转浏览器打开APP(APK)下载链接
查看>>
==与===的区别
查看>>
不同工具查看代码分支diff的差异
查看>>
白话Java I/O模型
查看>>
上传一张照片,让算法告诉你是否患有抑郁症
查看>>
VR厂商唯晶科技获2800万C+轮融资,曾开发过游戏《圣女之歌》
查看>>