【uva 753】A Plug for UNIX(图论--网络流最大流 Dinic)
题意:有N个插头,M个设备和K种转换器。要求插的设备尽量多,问最少剩几个不匹配的设备。
解法:给读入的各种插头编个号,源点到设备、设备通过转换器到插头、插头到汇点各自建一条容量为1的边。跑一次最大流就可得到最多匹配的设备数。
注意啊,我这个代码在神奇的地方死循环了——判断队列为空的语句......Σ( ° △ °|||)︴所以大家主要看“行文思路” ? :-)
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<algorithm>
5 #include<iostream>
6 #include<queue>
7 using namespace std;
8
9 const int N=110,M=110,K=110;
10 const int NN=310,MM=310,INF=(int)1e9;
11 int n,m,k,ts,st,ed,len;
12 int d[NN],last[NN];
13 char s[N],ss[N],str[3*N][N];//,sb[M][N];
14 struct edge{int x,y,fl,next;}a[MM];
15 queue<int> q;
16
17 int mmin(int x,int y) {return x<y?x:y;}
18 int get_id()
19 {
20 for (int i=1;i<=ts;i++)
21 if (!strcmp(s,str[i])) return i;
22 strcpy(str[++ts],s);
23 return ts;
24 }
25 void ins(int x,int y,int fl)
26 {
27 a[++len].x=x,a[len].y=y,a[len].fl=fl;
28 a[len].next=last[x],last[x]=len;
29 a[++len].x=y,a[len].y=x,a[len].fl=0;
30 a[len].next=last[y],last[y]=len;
31 }
32 bool bfs()
33 {
34 memset(d,-1,sizeof(d));
35 while(!q.empty()) q.pop();//这里死循环???-_-|||
36 q.push(st); d[st]=1;
37 while (!q.empty())
38 {
39 int x=q.front(); q.pop();
40 for (int i=last[x];i;i=a[i].next)
41 {
42 int y=a[i].y;
43 if (d[y]!=-1||!a[i].fl) continue;//fl
44 d[y]=d[x]+1, q.push(y);
45 //if (y==ed) break;//不这样为了第61行的优化
46 }
47 }
48 if (d[ed]==-1) return false;
49 return true;
50 }
51 int dfs(int x,int flow)
52 {
53 if (x==ed) return flow;
54 int sum=0;
55 for (int i=last[x];i;i=a[i].next)
56 {
57 int y=a[i].y;
58 if (d[y]!=d[x]+1||!a[i].fl) continue;//
59 int t=dfs(y, mmin(a[i].fl,flow-sum));
60 a[i].fl-=t, a[i^1].fl+=t;
61 sum+=t;
62 if (sum==flow) break;
63 }
64 if (sum==0) d[x]=-1;//
65 return sum;
66 }
67 int Dinic()
68 {
69 int sum=0;
70 while (bfs())
71 sum+=dfs(st,INF);//到这个点时的容量为INF
72 return sum;
73 }
74 int main()
75 {
76 int T,x,y;
77 scanf("%d",&T);
78 while (T--)
79 {
80 st=1,ed=2,len=1,ts=2;
81 scanf("%d",&n);
82 memset(last,0,sizeof(last));
83 for (int i=1;i<=n;i++)
84 {
85 scanf("%s",s);
86 x=get_id();
87 ins(x,ed,1);
88 }
89 scanf("%d",&m);
90 for (int i=1;i<=m;i++)
91 {
92 scanf("%s%s",s,s);
93 x=get_id();
94 ins(st,x,1);
95 }
96 scanf("%d",&k);
97 for (int i=1;i<=k;i++)
98 {
99 scanf("%s",s);
100 x=get_id();
101 scanf("%s",s);
102 y=get_id();
103 ins(x,y,1);
104 }
105 int ans=Dinic();
106 if (T) printf("\n");
107 printf("%d\n",m-ans);
108 }
109 return 0;
110 }
【uva 753】A Plug for UNIX(图论--网络流最大流 Dinic)的更多相关文章
- UVA - 753 A Plug for UNIX(网络流)
题意 给定一些插头设备和插座,有一些方法可以把其中一些插头变成另一种插头.求无法匹配插座的插头设备个数. 题解 用\(map\)给每个字符串标号为\(a_i\)和\(b_i\). 读入每种改变插头的方 ...
- 【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)
题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤ ...
- POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for UNIX / UVAlive 5418 A Plug for UNIX / SCU 1671 A Plug for UNIX (网络流)
POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for ...
- UVA 753 - A Plug for UNIX(网络流)
A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of the U ...
- UVA 753 A Plug for UNIX(二分图匹配)
A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of the Unit ...
- UVA 753 A Plug for UNIX 电器插座(最大基数匹配,网络流)
题意: 给n个插座,m个设备(肯定要插电了),k种转换头可无限次使用(注意是单向的),问有多少设备最终是不能够插上插座的? 分析: 看起来就是设备匹配插座,所以答案不超过m.这个题适合用网络流来解. ...
- UVa 753 - A Plug for UNIX(最大流)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 753 A Plug for UNIX (最大流)
题意:给定 n 种插座,m种设备,和k个转换器,问你最少有几台设备不能匹配. 析:一个很裸的网络流,直接上模板就行,建立一个源点s和汇点t,源点和每个设备连一条边,每个插座和汇点连一条边,然后再连转换 ...
- UVA 753 A Plug for UNIX (最大流)
关键在建图,转换器连一条容量无限的边表示可以转化无数次,设备的插头连源点,插座连汇点. dinic手敲已熟练,输出格式又被坑,总结一下,输出空行多case的,一个换行是必要的,最后一个不加空行,有Te ...
随机推荐
- 常用 .gitignore 模板
前言 每次建项目的时候可以直接复制了,也算是方便自己,以后发现少的会更新 正文 作用 git提交时忽略文件 文件名 .gitignore Python # Byte-compiled / optimi ...
- Python模块化编程与装饰器
Python的模块化编程 我们首先以一个例子来介绍模块化编程的应用场景,有这样一个名为requirements.py的python3文件,其中两个函数的作用是分别以不同的顺序来打印一个字符串: # r ...
- Windows DHCP最佳实践(四)
这是Windows DHCP最佳实践和技巧的最终指南. 如果您有任何最佳做法或技巧,请在下面的评论中发布它们. 在本指南(四)中,我将分享以下DHCP最佳实践和技巧. 使用DHCP中继代理 防止恶意D ...
- 目录遍历 - Pikachu
概述: 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活. 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应 ...
- CyNix-lxd提权
0x01 信息收集 nmap -p- -T5 192.168.43.155扫描开放端口 nmap -sV -p 80,6688 -A 192.168.43.155 -oA cynix扫描指定端口 go ...
- 在Firefox上使用Chrome的crx扩展程序
假如你喜欢使用Firefox火狐浏览器,可是发现有个很喜欢很想用的扩展只发布了支持Chrome的crx格式--Firefox从57版以后使用了WebExtension API作为新附加组件的开发标准, ...
- 入门OJ:Coin
题目描述 你有n个硬币,第i硬币面值为ai,现在总队长想知道如果丢掉了某个硬币,剩下的硬币能组成多少种价值?(0价值不算) 输入格式 第一行一个整数n 第二行n个整数.,a1,a2-an. 1< ...
- consul是什么?
consul概念: consul是用来做注册中心的 他和eureka是一样的 注册中心一般都是集群的形式存在保证高可用 consul像是一个nosql 存储着键值对 可以做存储consul是c/s架构 ...
- iDRAC RAC0218 最大会话数
戴尔服务器IDRAC能ping通,但是网页打不开的时候: 用putty登录: /admin1-> racadm racreset RAC reset operation initated suc ...
- java虚拟机——轻松搞懂jvm
一.JVM体系结构概述 JVM位置 JVM体系结构 1.1 类加载器 ClassLoader 类加载器(ClassLoader)负责加载class文件,class文件在文件开头有特定的文件标示,并 ...