【网络流#4】UVA 753 最大流

news/2023/9/25 4:59:43

最近开始刷网络流的题目了,先从紫书上的开始,这道题是P374上的,嘛,总之这道题最终还是参考了一下紫书。

中间是用了STL中map将字符串映射成编号,使用编号总比是用字符串简单的多。

超级源点S与各个设备对应插头类型连一条边,容量为1,

超级汇点T与各个插头连一条边,容量为1

然后如果有转换器,如果x->y,那么从点x连一条容量为正无穷的边到y (因为插头同类型的有无数个)

这样跑一发最大流即可,代码中间套用模板

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<set>
  7 #include<map>
  8 #include<stack>
  9 #include<vector>
 10 #include<queue>
 11 #include<string>
 12 #include<sstream>
 13 #define MAXN 405
 14 #define MAXM 805
 15 #define INF ((1<<30)/2)
 16 #define eps 0.000001
 17 #define ALL(x) x.begin(),x.end()
 18 #define INS(x) inserter(x,x.begin())
 19 using namespace std;
 20 int i,j,k,n,m,x,y,T,num,w;
 21 
 22 const int inf = 0x3f3f3f3f;
 23 struct edgenode
 24 {
 25     int from,to,next;
 26     int cap;
 27 }edge[MAXM];
 28 int Edge,head[MAXN],ps[MAXN],dep[MAXN];
 29 
 30 void add_edge(int x,int y,int c)
 31 {
 32     edge[Edge].from=x;
 33     edge[Edge].to=y;
 34     edge[Edge].cap=c;
 35     edge[Edge].next=head[x];
 36     head[x]=Edge++;
 37     
 38     edge[Edge].from=y;
 39     edge[Edge].to=x;
 40     edge[Edge].cap=0;
 41     edge[Edge].next=head[y];
 42     head[y]=Edge++;
 43 }
 44 
 45 int dinic(int n,int s,int t)
 46 {
 47     int tr,res=0;
 48     int i,j,k,l,r,top;
 49     while(1){
 50         memset(dep,-1,(n+1)*sizeof(int));
 51         for(l=dep[ps[0]=s]=0,r=1;l!=r;)//BFS部分,将给定图分层 
 52         {
 53             for(i=ps[l++],j=head[i];j!=-1;j=edge[j].next)
 54             {
 55                 if (edge[j].cap&&-1==dep[k=edge[j].to])
 56                 {
 57                     dep[k]=dep[i]+1;ps[r++]=k;
 58                     if(k==t)
 59                     {
 60                         l=r;
 61                         break;
 62                     }
 63                 }
 64             }
 65         }
 66         if(dep[t]==-1)break;
 67         
 68         for(i=s,top=0;;)//DFS部分 
 69         {
 70             if(i==t)//当前点就是汇点时 
 71             {
 72                 for(k=0,tr=inf;k<top;++k)
 73                     if(edge[ps[k]].cap<tr)tr=edge[ps[l=k]].cap;
 74                     
 75                 for(k=0;k<top;++k)
 76                     edge[ps[k]].cap-=tr,edge[ps[k]^1].cap+=tr;
 77                     
 78                 res+=tr;
 79                 i=edge[ps[top=l]].from;
 80             }
 81             
 82             for(j=head[i];j!=-1;j=edge[j].next)//找当前点所指向的点 
 83                 if(edge[j].cap&&dep[i]+1==dep[edge[j].to]) break;
 84                 
 85             if(j!=-1)
 86             {
 87                 ps[top++]=j;//当前点有所指向的点,把这个点加入栈中 
 88                 i=edge[j].to;
 89             }
 90             else
 91             { 
 92                 if (!top) break;//当前点没有指向的点,回溯 
 93                 dep[i]=-1;
 94                 i=edge[ps[--top]].from;
 95             }
 96         }
 97     }
 98     return res;
 99 }
100 
101 int main()
102 {
103     int T,cas,m,t,n,maxflow,i;
104     int x,y,c;
105     double ans;
106     scanf("%d",&T);
107     map <string,int> rec;
108     string s,s2;
109     while(T--)
110     {   
111         memset(head,-1,sizeof(head));
112         Edge=0;
113         scanf("%d",&n);
114         rec.clear();
115         num=1;//设定,0为源点,1为汇点 
116         for (i=1;i<=n;i++)
117         {
118             cin>>s;
119             if (!rec.count(s)) rec[s]=++num; 
120             add_edge(rec[s],1,1);
121         }
122         scanf("%d",&m);
123         for (i=1;i<=m;i++)
124         {
125             cin>>s>>s2;
126             if (!rec.count(s2)) rec[s2]=++num; 
127             add_edge(0,rec[s2],1);
128         }
129         scanf("%d",&k);
130         for (i=1;i<=k;i++)
131         {
132             cin>>s>>s2;
133             if (!rec.count(s))
134             {
135                 rec[s]=++num;
136             }
137             if (!rec.count(s2))
138             {
139                 rec[s2]=++num;
140             }
141             add_edge(rec[s],rec[s2],INF);
142         }
143         maxflow=dinic(num,0,1);
144         printf("%d\n",m-maxflow); 
145         if (T!=0) printf("\n");
146     }
147     return 0;
148 }
View Code

PS:这道题也是 poj 1087,但是poj中每组测试数据中一组数据,所以要把开始的scanf("%d",&T);去掉

 

转载于:https://www.cnblogs.com/zhyfzy/p/4046875.html


https://dhexx.cn/news/show-17127.html

相关文章

jenkins持续集成入门19 - (Pipeline Script from SCM)流水线项目 整合SonarQube代码审查

工作流程图 1 jenkins安装SonarQube Scanner插件 2 jenkins添加SonarQube凭证 3 Manage Jenkins->Configure System->SonarQube servers 4 Manage Jenkins->Global Tool Configuration 5 SonaQube-web界面中关闭审查结果上传到SCM功能 6 项目根目录下&#xff0c;…

水晶报表

水晶报表连接数据库打印 1 Dim Report As New crEnvironment 2 3 Report.SetDatabaseLogon(strUser, strPassword, strServer, strDefaultDatabase) 4 Report.PrintOptions.PaperSize CrystalDecisions.Shared.PaperSize.PaperA4 5 Report.ExportToDisk(CrystalDecisions.Sh…

android dtb文件位置_Android 测试工具——Monkeyrunner API

MonkeyRunner APIMonkeyRunner工具主要有三个类&#xff1a;MonkeyRunnerMonkeyDeviceMonkeyImage官方API文档 &#xff1a;http://www.android-doc.com/tools/help/monkeyrunner_concepts.html#1.MonkeyRunner类&#xff1a;MonkeyRunner提供连接真机和模拟器、输入、暂停、警…

mvn -f命令 在复合工程,多子项目中的使用

如以下工程&#xff0c;包含了3个子项目 命令使用如下 mvn -f pojo clean installmvn -f xinwen_producer clean package -DskipTests E:\javastudy\ee\multi_project>mvn -f pojo clean install E:\javastudy\ee\multi_project>mvn -f xinwen_producer clean package…

jenkins持续集成入门20 - maven复合工程 , 多个子项目的工程 jenkins用下拉框筛选一个项目工程 , 代码审查 , 编译工程

SonarQube代码审查的配置环境查看以下文档jenkins持续集成入门19 - (Pipeline Script from SCM)流水线项目 整合SonarQube代码审查_小哇-CSDN博客 项目工程的结构如下 1 在jenkins中新建一个项目,并创建参数,如下,此参数在Jenkinsfile文件中会有引用 2 在需要审查的每个项目的…

spring中的BeanFactory与ApplicationContext的作用和区别?

BeanFactory类关系继承图 1. BeanFactory类结构体系&#xff1a; BeanFactory接口及其子类定义了Spring IoC容器体系结构&#xff0c;由于BeanFactory体系非常的庞大和复杂&#xff0c;因此要理解Spring IoC&#xff0c;需要先理清BeanFactory的继承机构。 2. ApplicationConte…

jenkins持续集成入门21 - maven复合工程 , 多个子项目的工程 jenkins 可以勾选多个复选框,同时进行代码审查,代码编译

此案例的环境和配置信息,可查看如下文档,此案例在以下工程中升级,有此步骤省略jenkins持续集成入门20 - maven复合工程 , 多个子项目的工程 jenkins用下拉框筛选一个项目工程 , 代码审查 , 编译工程_小哇-CSDN博客 1 jenkins安装Extended Choice Parameter插件,支持多选框参数…

Windows 7系统安装MySQL5.5.21图解

Win7系统安装MySQL5.5.21图解 大家都知道MySQL是一款中、小型关系型数据库管理系统&#xff0c;非常具有有用性&#xff0c;对于我们学习非常多技术都有帮助&#xff0c;前几天我分别装了SQL Server 2008和Oracle 10g数据库&#xff0c;也用了JDBC去连接他们&#xff0c;都没有…

Filebeat入门及使用-1 控制台输入,控制台输出

软件版本&#xff1a; CentOS 7.4 ES 7.6.1版&#xff0c;Filebeat7.6.1版ES7.6.1 安装&#xff0c;可参考博文【ElasticSearch】 ElasticSearch安装&#xff08;一&#xff09; - H__D - 博客园案例1, 控制台输入&#xff0c;控制台输出1 新建配置文件test.yml # 输入 filebe…

基本的DMA控制器

DMA的基本概念     直接内存访问(DMA)是一种完全由硬件执行I/O交换的工作方式。在这种方式中&#xff0c;DMA控制器从CPU完全接管对总线的控制&#xff0c;数据交换不经过CPU&#xff0c;而直接在内存和I/O设备之间进行 。DMA方式一般用于高速传送成组数据。DMA控制器将向内…