【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 ...
随机推荐
- Github 简单使用
第一步:打开官网:https://github.com 注册一个帐户. 第二步:创建仓库 填写仓库的名字和描述. 创建好了之后,点击"Branch master",创建分支--在文 ...
- 【JDBC核心】JDBC 概述
JDBC 概述 数据的持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以"固 ...
- 【SpringMVC】SpringMVC 实现文件上传
SpringMVC 实现文件上传 文章源码 文件上传回顾 查看 JavaWeb 阶段的文件上传下载 实现步骤: 客户端: 发送 post 请求,告诉服务器要上传什么文件 服务器: 要有一个 form ...
- 【Jboss】一台服务器上如何部署多个jboss
一台服务器上如何部署多个jboss呢?直接把整个部署环境copy一份到相应的目录下? 这样只是前提,但是启动复制后的jboss就会发现,有很多端口被占用 3873,8080,8009,8443,808 ...
- CTFHub - Misc(流量分析)
数据库类流量: MySQL流量: 1.下载附件,是一个.pcap文件,用wireshark分析, 2.搜索ctfhub字段,即可得到flag, flag: ctfhub{mysql_is_S0_E4s ...
- disfunc绕过
绕过DisFunc的常见小技巧 解析webshell命令不能执行时的三大情况 一是 php.ini 中用 disable_functions 指示器禁用了 system().exec() 等等这类命令 ...
- [Usaco2015 dec]Breed Counting
原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4397 用线段树维护区间和即可.时间复杂度\(O((N+Q)logN)\). #includ ...
- 1.2V升5V电源芯片,1.2V升3V的IC电路图方案
镍氢电池就是典型的1.2V供电电源了,但是1.2V电压太低,需要电源芯片来1.2V升5V输出,或1.2V升3V输出稳压,1.2V单独难给其他芯片或者模块供电,即使串联1.2V*2=2.4V,也是因为电 ...
- vue、element-ui 后台菜单切换重新请求数据
我们在做后台管理系统时,通常将数据请求挂载到created或mounted钩子中,但这样引发的问题是它只会被出发一次,如果不同菜单中数据关联性较大,切换过程中未及时更新数据,容易引发一些问题,这种情况 ...
- Intellij idea 报错:Error : java 不支持发行版本5
保证下面几个地方编译版本一致: 分两步: 第一步,进入Project Structure中设置Project JDK 以及Project Level ,高于JDK5版本 第二步,进入设置中将项目的JD ...