题意:有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. 【C++】《Effective C++》第一章

    第一章 让自己习惯C++ C++是一个威力强大的语言,带着众多特性,但是在你可以驾驭其威力并有效运用其特性之前,你必须先习惯C++的办事方式. 条款01:视C++为一个语言联邦 如今的C++已经是个多 ...

  2. ssl证书与java keytool工具

    ssl协议 SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安 ...

  3. 【设计模式】Java设计模式精讲之原型模式

    简单记录 - 慕课网 Java设计模式精讲 Debug方式+内存分析 & 设计模式之禅-秦小波 文章目录 1.原型模式的定义 原型-定义 原型-类型 2.原型模式的实现 原型模式的通用类图 原 ...

  4. 【TNS】listener.ora模板;tnsnames.ora模板

    好多人使用监听的时候误操作,将监听弄的不好使了,这次这个模板,不光是针对大家出现的这种问题,也是给我自己留一个记录,方便他人,方便自己. listener.ora模板样例 -------------- ...

  5. pscp 从win10远程传输文件到centos7,多个虚拟机之间传文件

    一.将下载的pscp.exe拷贝到C:\Windows\System32 上传文件 win10 --> linux1 C:\Users\xy>pscp C:\BaiduNetdiskDow ...

  6. java.net.NoRouteToHostException: 没有到主机的路由

    今天在配置Jenkins 的云服务器的时候提示:java.net.NoRouteToHostException: 没有到主机的路由,网上查到的没有主机路由问题提到的大多是防火墙问题. 查看防火墙状态: ...

  7. Python执行程序实可视化_heartrate

    最近发现了一个Python程序执行的简单实时可视化神器,名字叫 heartrate,安装完运行可以看到下面这样的炫酷过程. 虽然很炫酷,但有点看不懂. 来解释下,左边的动态数字代表每行被触发的次数.变 ...

  8. feign使用okHttpClient,调用原理

    最近项目中 spring cloud 用到http请求,使用feign,配置okhttp,打算配置一下就直接使用,不过在压测与调优过程中遇到一些没有预测到的问题,附上排查与解析结 yml.pom配置 ...

  9. JavaScript中的Promise【期约】[未完成]

    JavaScript中的Promise[期约] 期约主要有两大用途 首先是抽象地表示一个异步操作.期约的状态代表期约是否完成. 比如,假设期约要向服务器发送一个 HTTP 请求.请求返回 200~29 ...

  10. Flutter--Flutter中Widget、App的生命周期

    前言 在App的开发过程中,我们通常都需要了解App以及各个页面的生命周期,方便我们在App进入前台时启动一些任务,在进入后台后暂停一些任务.同时,各个页面的生命周期也很重要,每个页面消失时要做一些内 ...