题意:有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)的更多相关文章

  1. UVA - 753 A Plug for UNIX(网络流)

    题意 给定一些插头设备和插座,有一些方法可以把其中一些插头变成另一种插头.求无法匹配插座的插头设备个数. 题解 用\(map\)给每个字符串标号为\(a_i\)和\(b_i\). 读入每种改变插头的方 ...

  2. 【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)

    题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤ ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. UVA 753 A Plug for UNIX 电器插座(最大基数匹配,网络流)

    题意: 给n个插座,m个设备(肯定要插电了),k种转换头可无限次使用(注意是单向的),问有多少设备最终是不能够插上插座的? 分析: 看起来就是设备匹配插座,所以答案不超过m.这个题适合用网络流来解. ...

  7. UVa 753 - A Plug for UNIX(最大流)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. UVa 753 A Plug for UNIX (最大流)

    题意:给定 n 种插座,m种设备,和k个转换器,问你最少有几台设备不能匹配. 析:一个很裸的网络流,直接上模板就行,建立一个源点s和汇点t,源点和每个设备连一条边,每个插座和汇点连一条边,然后再连转换 ...

  9. UVA 753 A Plug for UNIX (最大流)

    关键在建图,转换器连一条容量无限的边表示可以转化无数次,设备的插头连源点,插座连汇点. dinic手敲已熟练,输出格式又被坑,总结一下,输出空行多case的,一个换行是必要的,最后一个不加空行,有Te ...

随机推荐

  1. Flutter 基础组件:输入框和表单

    前言 Material组件库中提供了输入框组件TextField和表单组件Form. 输入框TextField 接口描述 const TextField({ Key key, // 编辑框的控制器,通 ...

  2. 搞定面试官:咱们从头到尾再说一次 Java 垃圾回收

    接着前几天的两篇文章,继续解析JVM面试问题,送给年后想要跳槽的小伙伴 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题..... 万万没想到,JVM内存区域的面试题也可以问 ...

  3. 【Spring】Spring的数据库开发 - 1、Spring JDBC的配置和Spring JdbcTemplate的解析

    Spring JDBC 文章目录 Spring JDBC Spring JdbcTemplate的解析 Spring JDBC的配置 简单记录-Java EE企业级应用开发教程(Spring+Spri ...

  4. SAP RFC的相关的术语说明

    工作比较忙,很少有时间写点文章,抽空写点吧,给需要的人看看,虽然徒弟很多了,不过还是不要固步自封,在这里也指导更多的人进步吧. RFC(Remote Function Call)是SAP系统和其他(S ...

  5. SP338 ROADS

    题目描述 城市中有R条有向马路,n个马路连接点,通过每条马路都要花去一定费用.你现在在编号为1的连接点 ,手里有k元钱,要去n号连接点的最短路径的长度是多少?途中经过道路的花费不能超过k.注意:两个 ...

  6. 理解js闭包9大使用场景

    1.返回值(最常用) //1.返回值 最常用的 function fn(){ var name="hello"; return function(){ return name; } ...

  7. java虚拟机入门(三)- 你了解对象吗

    对象对于java程序员来说,那是想要多少就有多少,所以那些嘲笑程序员的单身狗,哼,只有无知使你们快乐,想我大java开发,何曾缺少过对象.我们不仅仅知道创建对象,还知道创建对象的过程是啥样的,不信?往 ...

  8. Java SPI机制详解

    Java SPI机制详解 1.什么是SPI? SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制.SPI是一种动态替换发现的机制, 比如有个 ...

  9. 服务发现 ap cp 强一致性 最终一致性 dns vip ip

    为什么基于域名 08 | 服务发现:到底是要CP还是AP? https://time.geekbang.org/column/article/208171 为什么需要服务发现?先举个例子,假如你要给一 ...

  10. Cognos软件介绍文档(原创)

    1. Cognos简介 Cognos是世界上最大的业务智能软件制造商,它能够帮助用户提取公司数据,然后分析并汇总得出报告.Cognos有许多产品,但最为著名的还是它的PowerPlay联机分析处理(o ...