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 ...
随机推荐
- 数据交换格式之 - XML
XML简介 XML是一种可扩展的标记语言,被设计用来传输和存储数据.传输数据. 需要自定义标签,自我描述性,XML是W3C的推荐标准: XML的特点与作用 特点: xml与操作系统.编程语言的开发平台 ...
- 关于python的列表操作(一):取值,增加,修改,删除
# 列表操作 name_list = ["wang", "niu", "bai", "sui"] # 取值 print( ...
- 二、Python安装和第一个程序
<1.Python语言介绍1.官方介绍:Python 是一款易于学习且功能强大的编程语言. 它具有高效率的数据结构,能够简单又有效地实现面向对象编程.Python 简洁的语法与动态输入之特性,加 ...
- 挑逗 Java 程序员的那些 Scala 绝技
有个问题一直困扰着 Scala 社区,为什么一些 Java 开发者将 Scala 捧到了天上,认为它是来自上帝之吻的完美语言:而另外一些 Java 开发者却对它望而却步,认为它过于复杂而难以理解.同样 ...
- MR过程解析(转自about云)
图中1:表示待处理数据,比如日志,比如单词计数图中2:表示map阶段,对他们split,然后送到不同分区图中3:表示reduce阶段,对这些数据整合处理.图中4:表示二次mapreduce,这个是m ...
- vue socketio如何使用及跨域问题
我的后端使用的flask_socketio做服务端 前端使用的vue_socketio当客户端 vue.config.js配置 module.exports = { outputDir: proce ...
- mybatis深入理解(八)-----关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- C++使用stringstream分割字符串
在这里查看getline的函数声明如下: 可以看到,第三个参数delim是分隔符,可以指定不同的分隔符,如果不指定的话就默认是'\n'. 举个例子:
- 自定义确定框(confirm)
1.先引入 confirm.css @charset "UTF-8"; lq-alert { width: 100%; height: 100%; background: rgba ...
- mysql 无法存储joda time的datetime类型
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '\xAC\xED\x00\x05sr\x ...