【uva753/poj1087/hdu1526-A Plug for UNIX】最大流
题意:给定n个插座,m个插头,k个转换器(x,y),转换器可以让插头x转成插头y。问最少有多少个插头被剩下。
题解:
最大流或者二分图匹配。然而我不知道怎么打二分图匹配。。
打了最大流。这题字符串比较坑爹,我就先把所有字符串编号(去重),然后给每个点编两个号,一个代表它作为插头的编号,一个代表它作为插座的编号。
最坑的是uvaWA了好久最后发现结尾要有一个回车。。。。。
还有数据范围也是个坑点,点起码要开500。
代码如下:(poj上是单组数据,uva和hdu都是多组)
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<queue>
- using namespace std;
- const int N=,L=,INF=(int)1e9;
- char s[N][L],c1[L],c2[L];
- int ss[N],sc[N],lc[N],rc[N],dis[N],first[N],len,n,m,k,l,num;
- struct node{
- int x,y,d,next;
- }a[];
- queue<int> q;
- int minn(int x,int y){return x<y ? x:y;}
- void ins(int x,int y,int d)
- {
- a[++len].x=x;a[len].y=y;a[len].d=d;
- a[len].next=first[x];first[x]=len;
- a[++len].y=x;a[len].x=y;a[len].d=;
- a[len].next=first[y];first[y]=len;
- }
- bool bfs(int st,int ed)
- {
- while(!q.empty()) q.pop();
- memset(dis,-,sizeof(dis));
- q.push(st);dis[st]=;
- while(!q.empty())
- {
- int x=q.front();q.pop();
- for(int i=first[x];i!=-;i=a[i].next)
- {
- int y=a[i].y;
- if(dis[y]==- && a[i].d)
- {
- dis[y]=dis[x]+;
- q.push(y);
- }
- }
- }
- return (dis[ed]!=-);
- }
- int dfs(int x,int ed,int flow)
- {
- if(x==ed) return flow;
- int r=;
- for(int i=first[x];i!=-;i=a[i].next)
- {
- int y=a[i].y;
- if(dis[y]==dis[x]+ && a[i].d)
- {
- int p=minn(flow-r,a[i].d);
- p=dfs(y,ed,p);
- r+=p;
- a[i].d-=p;
- a[i^].d+=p;
- }
- }
- if(r==) dis[x]=-;
- return r;
- }
- int dinic(int st,int ed)
- {
- int ans=;
- while(bfs(st,ed))
- ans+=dfs(st,ed,INF);
- return ans;
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- int st,ed;
- scanf("%d",&n);
- l=;len=-;
- memset(first,-,sizeof(first));
- memset(sc,,sizeof(sc));
- memset(ss,,sizeof(ss));
- for(int i=;i<=n;i++)
- {
- scanf("%s",s[++l]);
- bool bk=;
- for(int j=;j<l;j++)
- {
- if(strcmp(s[l],s[j])==)
- {
- l--,ss[j]++;
- bk=;break;
- }
- }
- if(!bk) ss[l]++;
- }
- scanf("%d",&m);
- for(int i=;i<=m;i++)
- {
- scanf("%s",s[++l]);
- scanf("%s",s[l]);
- bool bk=;
- for(int j=;j<l;j++)
- {
- if(strcmp(s[j],s[l])==)
- {
- l--,sc[j]++;
- bk=;break;
- }
- }
- if(!bk) sc[l]++;
- }
- st=;num=;
- for(int i=;i<=l;i++)
- {
- rc[i]=++num;
- lc[i]=++num;
- }
- scanf("%d",&k);
- for(int i=;i<=k;i++)
- {
- scanf("%s%s",c1,c2);
- int t1=,t2=;
- for(int j=;j<=l;j++)
- {
- if(strcmp(c1,s[j])==) t1=j;
- if(strcmp(c2,s[j])==) t2=j;
- if(t1 && t2) break;
- }
- if(!t1) t1=++l,strcpy(s[l],c1),lc[l]=++num,rc[l]=++num;
- if(!t2) t2=++l,strcpy(s[l],c2),lc[l]=++num,rc[l]=++num;
- ins(lc[t1],lc[t2],INF);
- }
- ed=num+;
- for(int i=;i<=l;i++)
- {
- if(ss[i]) ins(rc[i],ed,ss[i]);
- if(sc[i]) ins(st,lc[i],sc[i]);
- ins(lc[i],rc[i],INF);
- }
- printf("%d",m-dinic(st,ed));
- if(T) printf("\n\n");
- else printf("\n");
- }
- return ;
- }
【uva753/poj1087/hdu1526-A Plug for UNIX】最大流的更多相关文章
- 【poj1087/uva753】A Plug for UNIX(最大流)
A Plug for UNIX Description You are in charge of setting up the press room for the inaugural meeti ...
- POJ1087:A Plug for UNIX(最大流)
A Plug for UNIX 题目链接:https://vjudge.net/problem/POJ-1087 Description: You are in charge of setting u ...
- POJ1087 A Plug for UNIX —— 最大流
题目链接:https://vjudge.net/problem/POJ-1087 A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K T ...
- ZOJ1157, POJ1087,UVA 753 A Plug for UNIX (最大流)
链接 : http://acm.hust.edu.cn/vjudge/problem/viewProblem.action? id=26746 题目意思有点儿难描写叙述 用一个别人描写叙述好的. 我的 ...
- TZOJ 1911 A Plug for UNIX(最大流)
描述 You are in charge of setting up the press room for the inaugural meeting of the United Nations In ...
- POJ A Plug for UNIX (最大流 建图)
Description You are in charge of setting up the press room for the inaugural meeting of the United N ...
- UVa 753 A Plug for UNIX (最大流)
题意:给定 n 种插座,m种设备,和k个转换器,问你最少有几台设备不能匹配. 析:一个很裸的网络流,直接上模板就行,建立一个源点s和汇点t,源点和每个设备连一条边,每个插座和汇点连一条边,然后再连转换 ...
- hdu 1087 A Plug for UNIX 最大流
题意:http://www.phpfans.net/article/htmls/201012/MzI1MDQw.html 1.在一个会议室里有n种插座,每种插座一个: 2.每个插座只能插一种以及一个电 ...
- uva753 A Plug for UNIX 网络流最大流
C - A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of t ...
- POJ1087 A Plug for UNIX(网络流)
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total S ...
随机推荐
- Linux系统木马后门查杀方法详解
木马和后门的查杀是系统管理员一项长期需要坚持的工作,切不可掉以轻心.以下从几个方面在说明Linux系统环境安排配置防范和木马后门查杀的方法: 一.Web Server(以Nginx为例) 1.为防止跨 ...
- 状压DP
今天稍微看了下状压DP,大概就是这样子的,最主要的就是位运算, i and (1<<k)=0 意味着i状态下没有 k : i and (1<<k)>0 意味着i状态下有 ...
- Machine Learning 学习笔记 (1) —— 线性回归与逻辑回归
本系列文章允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 梯度下降法 (Gradien ...
- CS小分队第一阶段冲刺站立会议(5月6日)
冲刺阶段第一天 今日任务:完成游戏2048退出自动保存和进入自动读取功能,完善其他功能.
- Windows 7系统下删除开机引导项的方法
Windows 7系统下删除开机引导项的方法: 1.使用管理员权限运行cmd,在命令行窗口使用 bcdedit 回车 2.查找description为你想删除的段,看对应的标识符是多少, 然后使用 ...
- background-origin
background-origin 设置元素背景图片的原始起始位置. 语法: background-origin : border-box | padding-box | content-box; 参 ...
- 阴影 box-shadow(二)
阴影 box-shadow(二) 1.阴影模糊半径与阴影扩展半径的区别 阴影模糊半径:此参数可选,其值只能是为正值,如果其值为0时,表示阴影不具有模糊效果,其值越大阴影的边缘就越模糊: 阴影扩展半径: ...
- Careercup - Microsoft面试题 - 6314866323226624
2014-05-11 05:29 题目链接 原题: Design remote controller for me. 题目:设计一个遥控器. 解法:遥控什么?什么遥控?传统的红外线信号吗?我只能随便说 ...
- SQLServer BCP 命令的使用
现在有一个包含数据的文件,每个字段用“|”分隔,现在要把这些数据导入到数据库的表中. 数据文件如下: R001|20150710 可以使用如下命令: bcp testDB.dbo.testTable ...
- JS学习笔记-1--基本知识和注意事项
1.JS开始的目的主要是验证表单的输入验证 2.是一种具有面向对象能力的.解释型语言.是基于事件驱动的相对较安全的客户端脚本语言 3.JS 特点:松散型:变量不具备一个明确的类型: 对象属性:把属 ...