【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 ...
随机推荐
- 【Spring】Spring JdbcTemplate
Spring JdbcTemplate 文章源码 JdbcTemplate 概述 它是 Spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装.Spring 框架提供了很多的操 ...
- Python实验6--网络编程
题目1 1.编写程序实现基于多线程的TCP客户机/服务器程序. (1)创建服务器端套接字Socket,监听客户端的连接请求: (2)创建客户端套接字Socket,向服务器端发起连接: 服务器端套接字 ...
- 【Oracle】10g rac如何开启归档和关闭归档
开启归档: 1.设置想设置的归档的位置,我们这里归档的位置为ASM磁盘组,磁盘组的名称为DATA alter system set log_archive_dest_1='location=+DATA ...
- kubernets之持久卷的动态配置
一 介绍持久卷的动态配置原理 前面介绍的pv以及pvc,都需要kubernets集群管理员来支持实际的底层存储,但是kubernets还支持动态配置持久卷来自动化完成这个任务集群管理员可以创建一个持 ...
- 与图论的邂逅05:最近公共祖先LCA
什么是LCA? 祖先链 对于一棵树T,若它的根节点是r,对于任意一个树上的节点x,从r走到x的路径是唯一的(显然),那么这条路径上的点都是并且只有这些点是x的祖先.这些点组成的链(或者说路径)就是x的 ...
- 亲测可用!免费下载QQ音乐大部分资源!
优化后亲测可用!免费下载QQ音乐大部分资源 通知 时间问题 博客园这边暂时停更要下载的去GitHub或者90盘 GitHub项目地址 https://github.com/TotoWang-hhh/m ...
- 一文说通Dotnet的委托
简单的概念,也需要经常看看. 一.前言 先简单说说Delegate的由来.最早在C/C++中,有一个概念叫函数指针.其实就是一个内存指针,指向一个函数.调用函数时,只要调用函数指针就可以了,至于函 ...
- Vue之创建组件之配置路由!
Vue之创建组件之配置路由!== 第一步: 当然就是在我们的试图文件夹[views]新建一个文件夹比如home 在home文件夹下面新建一个文件index.vue 第二步:在router目录下做如下事 ...
- python_3 装饰器参数之谜
装饰器参数之谜 之前已经初步了解过装饰器了,知道了装饰器可以"偷梁换柱",在不改变函数的调用方式和函数内容的时候,而把函数的功能偷偷地修改. 那么问题来了,如果被修改的函数中有参数 ...
- linux系统层面调优
linux系统层面调优和常见的面试题 - 云+社区 - 腾讯云 https://cloud.tencent.com/developer/article/1664287