poj1087&&hdu1526 最大流
多源多汇。
比较明显的建图。对于电器,可以从源点与各个电器相连,容量为1,表示这个电器有1个,然后对于各种接头,那可以各个接头与汇点相连,容量为1,表示每个接头只能用一次。
然后对于能够相互转换的接头,其容量为无穷,文中写到转换器可以无穷使用。然后对于电器和其使用的接头,相连,容量为1表示该电器使用该接头。然后求一次最大流,表示最多可以使用的电器,然后见一下即可。
由于字符串,用map搞了半天。
poj 79MS
hdu 15MS
下面是poj代码:
#include<stdio.h>
#include<string.h>
#include<string>
#include<map>
#include<queue>
#include<iostream>
#define maxn 500
#define INF 9999999
using namespace std;
map<string,int>d,num;
int mp[maxn][maxn],n,m,fn,vis[maxn],F;//fn表示插头的种类数
string name,s1,s2;
string s[],fname[];
int min(int x,int y)
{return x<y?x:y;}
void makemap()
{
int i,j;
for(i=;i<m;i++)
{
mp[d[s[i]]][d[fname[i]]]=;
//printf("%d %d\n",d[s[i]],d[fname[i]]);
}
for(i=;i<=F;i++)
{
mp[i][n+]=;
}
for(i=fn+;i<=n;i++)
{
mp[][i]=;
}
}
int BFS()
{
int i,j;
queue<int>q;
memset(vis,-,sizeof(vis));
vis[]=;
q.push();
while(!q.empty())
{
int t=q.front();
q.pop();
for(i=;i<=n+;i++)
{
if(vis[i]<&&mp[t][i])
{
vis[i]=vis[t]+;
q.push(i);
}
}
}
if(vis[n+]>)
return ;
return ;
}
int dfs(int u,int low)
{
int i,j,a;
if(n+==u)
return low;
for(i=;i<=n+;i++)
{
if(vis[i]==vis[u]+&&mp[u][i])
{
a=dfs(i,min(low,mp[u][i]));
if(!a)continue;
mp[u][i]-=a;
mp[i][u]+=a;
return a;
}
}
return ;
}
int main()
{
int t,i,j,cou=;
while(scanf("%d",&F)!=EOF)
{
memset(mp,,sizeof(mp));
for(i=;i<F;i++)
{
cin>>name;
d[name]=cou++;
}
scanf("%d",&m);
for(i=;i<m;i++)
{
cin>>s[i];
cin>>fname[i];
if(!d[fname[i]])
d[fname[i]]=cou++;
}
fn=cou-;
//printf("%d\n",fn);
for(i=;i<m;i++)
{
if(!d[s[i]])
d[s[i]]=cou++;
}
n=cou-;
makemap();
//printf("%d\n",n);
scanf("%d",&t);
for(i=;i<t;i++)
{
cin>>s1>>s2;
mp[d[s1]][d[s2]]=INF;
}
//printf("%d\n",d[s[0]]);
/*for(i=0;i<=n+1;i++)
{
for(j=0;j<=n+1;j++)
{
printf("%d ",mp[i][j]);
}
printf("\n");
}*/
int ans=;
while(BFS())
{
while()
{
int a=dfs(,INF);
if(!a)break;
ans+=a;
}
}
printf("%d\n",m-ans);
}
}
hdu比较坑,爆栈,然后加了一句话#pragma comment(linker, "/STACK:1024000000,1024000000")
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<string>
#include<map>
#include<queue>
#include<iostream>
#define maxn 500
#define INF 9999999
using namespace std;
map<string,int>d,num;
int mp[maxn][maxn],n,m,fn,vis[maxn],F;//fn表示插头的种类数
string name,s1,s2;
string s[],fname[];
int min(int x,int y)
{return x<y?x:y;}
void makemap()
{
int i,j;
for(i=;i<m;i++)
{
mp[d[s[i]]][d[fname[i]]]=;
//printf("%d %d\n",d[s[i]],d[fname[i]]);
}
for(i=;i<=F;i++)
{
mp[i][n+]=;
}
for(i=fn+;i<=n;i++)
{
mp[][i]=;
}
}
int BFS()
{
int i,j;
queue<int>q;
memset(vis,-,sizeof(vis));
vis[]=;
q.push();
while(!q.empty())
{
int t=q.front();
q.pop();
for(i=;i<=n+;i++)
{
if(vis[i]<&&mp[t][i])
{
vis[i]=vis[t]+;
q.push(i);
}
}
}
if(vis[n+]>)
return ;
return ;
}
int dfs(int u,int low)
{
int i,j,a;
if(n+==u)
return low;
for(i=;i<=n+;i++)
{
if(vis[i]==vis[u]+&&mp[u][i])
{
a=dfs(i,min(low,mp[u][i]));
if(!a)continue;
mp[u][i]-=a;
mp[i][u]+=a;
return a;
}
}
return ;
}
int main()
{
int t,i,j,cou,ft;
scanf("%d",&ft);
while(ft--)
{
cou=;
scanf("%d",&F);
memset(mp,,sizeof(mp));
d.clear(); for(i=;i<F;i++)
{
cin>>name;
d[name]=cou++;
}
scanf("%d",&m);
for(i=;i<m;i++)
{
cin>>s[i];
cin>>fname[i];
if(!d[fname[i]])
d[fname[i]]=cou++;
}
fn=cou-;
//printf("%d\n",fn);
for(i=;i<m;i++)
{
if(!d[s[i]])
d[s[i]]=cou++;
}
n=cou-;
makemap();
//printf("%d\n",n);
scanf("%d",&t);
for(i=;i<t;i++)
{
cin>>s1>>s2;
mp[d[s1]][d[s2]]=INF;
}
//printf("%d\n",d[s[0]]);
/*for(i=0;i<=n+1;i++)
{
for(j=0;j<=n+1;j++)
{
printf("%d ",mp[i][j]);
}
printf("\n");
}*/
int ans=;
while(BFS())
{
while()
{
int a=dfs(,INF);
if(!a)break;
ans+=a;
}
}
printf("%d\n",m-ans);
if(ft)printf("\n");
}
}
poj1087&&hdu1526 最大流的更多相关文章
- aPlugForUNIX(POJ-1087)【最大流】
题目链接:https://vjudge.net/problem/POJ-1087 题意:有N个插座,M个电器,K种转换头(每种转换头有无限多个),求最多能同时给多少台设备供电 思路: 首先,建立源点和 ...
- poj1087(最大流)
传送门:A Plug for UNIX 题意:有插座用电器和适配器,用电器有插头,适配器本身有一个插孔和插头,它的作用是可以把别的插头插入到适合该适配器插孔的适配器,然后就可以用适配器的插头接到适合的 ...
- poj1087 A Plug for UNIX & poj1459 Power Network (最大流)
读题比做题难系列…… poj1087 输入n,代表插座个数,接下来分别输入n个插座,字母表示.把插座看做最大流源点,连接到一个点做最大源点,流量为1. 输入m,代表电器个数,接下来分别输入m个电器,字 ...
- 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 ...
- POJ-1087(最大流+EK算法)
A Plug for UNIX POJ-1087 这一题也是最大流的应用,但是题目有点绕. 题目的意思就是有插座和插头,只不过这里使用设备取代了插头.只有插座和设备进行匹配了. 题目要注意的是那个适配 ...
- poj1087 A Plug for UNIX(网络流最大流)
http://poj.org/problem?id=1087 好久没遇见过这么坑的题了这个题真是挫的够可以的.题目大意:你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器 ...
- 【uva753/poj1087/hdu1526-A Plug for UNIX】最大流
题意:给定n个插座,m个插头,k个转换器(x,y),转换器可以让插头x转成插头y.问最少有多少个插头被剩下. 题解: 最大流或者二分图匹配.然而我不知道怎么打二分图匹配..打了最大流.这题字符串比较坑 ...
- 【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 ...
随机推荐
- Bootstrap.之模态框 显示在遮罩层后面
Bootstrap.之模态框 显示在遮罩层后面 问题描述: 在使用bootstrap模态框,弹出的窗口在遮罩层后面,见图: 解决方案: 保证模态框的代码,所在的上一级(父元素)是body标签,即可.例 ...
- HTML入门:Tag学习
即使 <br> 在所有浏览器中的显示都没有问题,使用 <br /> 也是更长远的保障. 标签 描述 <html> 定义 HTML 文档. <body> ...
- spring源码学习之AOP(一)
继续源码学习,看了spring中基础的容器和AOP感觉自己也没有什么长进,哈哈,我也不知道到底有用没有,这可能是培养自己的一种精神吧,不管那么多,继续学习!AOP中 AOP中几个重要的概念:(1)Ad ...
- TZ_13_负载均衡-Robbin
1.但是实际环境中,我们往往会开启很多个user-service的集群.此时我们获取的服务列表中就会有多个,到底该访问哪一个呢? 一般这种情况下我们就需要编写负载均衡算法,在多个实例列表中进行选择. ...
- LintCode 两两交换链表中的节点
给一个链表,两两交换其中的节点,然后返回交换后的链表. 样例 给出 1->2->3->4, 你应该返回的链表是 2->1->4->3. 分析:第一次调试的时候用了P ...
- GitHub and Git
book:https://git-scm.com/book/zh/v2 Git使用简易指南:https://www.bootcss.com/p/git-guide
- day18 13.乐观锁介绍
乐观锁是使用版本字段,悲观锁是使用数据库底层的锁机制.mysql的类型timestamp(时间戳)有一个特点:插入数据不用管我,我取系统当前默认值.timestamp插入时间会记录,修改时间也会记录. ...
- 未加星标 ajax三级联动的实现方法
<div id="sanji"></div> 下面考虑的是要有省市区这三列,这三列用的是下拉列表,那么里面要用<option></opti ...
- Etag 和 If-None-Match
ETag是HTTP1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证. 它的原理是这样的,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f ...
- LintCode刷题笔记-- Maximal Square
标签:动态规划 题目描述: Given a 2D binary matrix filled with 0's and 1's, find the largest square containing a ...