http://poj.org/problem?id=1087

好久没遇见过这么坑的题了这个题真是挫的够可以的。题目大意:你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器(手机,电脑一类的),

也有其对应型号;可是不一定用电器就能和插座匹配上,于是宾馆的商店里提供了一些转换器,这些转换器可以将某一型号电源转换成另一型号的。问,你的用电器最少会有多少种无

法充电。也就是问可以用上电的用电器的最大数目,之后用电器总数减去此可用电最大数目即可得到最小不能用电数目。

一开始以为直接将插座,转换器,用电器匹配后跑个最大流模板就行,后来发现想的太简单了。

分析:

1:用电器可直接连插座;

2:用电器可以连接转换器再连接上插座;

3:转换器之间可以相互连接;

4:转换器转换作用是双向的,比如给定转换器可对A和B进行转换,则此转换器可以将A转换成B,也可以将B转换成A;

5:每种转换器的数目是无限的;

6:一个插座只能连接产生一个出处。

7:虚拟一个源点一个汇点即可,源点到插座和插头到汇点的流量为1。

按照这些建图失误了四次之后终于成功A过了。

附加详细建图步骤的备注的AC代码和一组测试数据(测试答案应当为0)

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
#define oo 0x3f3f3f3f
int G[][], n, m, p, vis[];
char receptacle[][];
char plug[][];
struct ad
{
char in[], out[];
}adapter[]; bool bfs(int Start, int End)
{
memset(vis, , sizeof(vis));
vis[Start] = ; queue<int>Q;
Q.push(Start); while(Q.size())
{
int now = Q.front();
Q.pop(); if(now == End)
return true; for(int i=; i<=End; i++)
{
if(!vis[i] && G[now][i]>)
{
vis[i] = vis[now] + ;
Q.push(i);
}
}
} return false;
} int dfs(int Start, int End, int Maxflow)
{
if(Start == End)
return Maxflow; int nowflow = ; for(int i=; i<=End; i++)
{
if(vis[i] == vis[Start] + && G[Start][i]>)
{
int flow = min(G[Start][i], Maxflow - nowflow); flow = dfs(i, End, flow); G[Start][i] -= flow;
G[i][Start] += flow; nowflow += flow; if(nowflow == Maxflow)
break;
}
} return nowflow;
}
int dinic(int Start, int End)
{
int ans = , s; while(bfs(Start, End))
{
s = dfs(Start, End, oo);
if(!s)break;
ans += s;
} return ans;
}
int main()
{
while(~scanf("%d", &n))
{
memset(G, , sizeof(G)); for(int i=; i<=n; i++)
scanf("%s", receptacle[i]); scanf("%d", &m);
for(int i=; i<=m; i++)
{
scanf("%*s %s", plug[i]);
for(int j=; j<=n; j++)
{
if(strcmp(receptacle[j], plug[i]) == )///插头和插座可直接连
{
G[j][n+p+i] = ;
}
}
} scanf("%d", &p);
for(int i=; i<=p; i++)
scanf("%s %s", adapter[i].in, adapter[i].out); for(int i=; i<=p; i++)///1~n是插座,n+1~n+p是转换器,n+p+1~n+p+m是插头
{
for(int j=; j<=n; j++)
{
if(strcmp(receptacle[j], adapter[i].in)== || strcmp(receptacle[j], adapter[i].out)==)///插座和转换器匹配
{
G[j][n+i] = ;
}
} for(int j=; j<=m; j++)
{
if(strcmp(plug[j], adapter[i].out)== || strcmp(plug[j], adapter[i].in)==)///转换器和插头匹配
{
G[n+i][n+p+j] = ;
}
}
} for(int i=; i<=p; i++)///转换器之间相连
{
for(int j=; j<=p; j++)
{
if(i!=j && strcmp(adapter[i].in, adapter[j].out)==)
G[n+i][n+j] = oo;
}
for(int j=; j<=p; j++)
{
if(i!=j && strcmp(adapter[i].out, adapter[j].in)==)
G[n+i][n+j] = oo;
}
} int Start = n+p+m+, End = Start+; for(int i=; i<=n; i++)///源点和插座相连
{
G[Start][i] = ;
} for(int i=; i<=m; i++)///插头和汇点相连
{
G[n+p+i][End] = ;
} printf("%d\n", m - dinic(Start, End));
}
return ;
} /*
16
A
D
X
A
D
A
D
X
D
A
D
D
X
D
X
D
14
CLOCK B
CLOCK B
CLOCK B
LAPTOP B
LAPTOP B
LAPTOP B
LAPTOP B
LAPTOP B
LAPTOP B
PAGER B
PAGER B
COMB X
CELL C
CELL C
4
C D
X D
B X
B A
*/

poj1087 A Plug for UNIX(网络流最大流)的更多相关文章

  1. 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 ...

  2. poj 1087 C - A Plug for UNIX 网络流最大流

    C - A Plug for UNIXTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contes ...

  3. POJ1087 A Plug for UNIX 【最大流】

    A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13855   Accepted: 4635 ...

  4. UVa753/POJ1087_A Plug for UNIX(网络流最大流)(小白书图论专题)

    解题报告 题意: n个插头m个设备k种转换器.求有多少设备无法插入. 思路: 定义源点和汇点,源点和设备相连,容量为1. 汇点和插头相连,容量也为1. 插头和设备相连,容量也为1. 可转换插头相连,容 ...

  5. 【uva753/poj1087/hdu1526-A Plug for UNIX】最大流

    题意:给定n个插座,m个插头,k个转换器(x,y),转换器可以让插头x转成插头y.问最少有多少个插头被剩下. 题解: 最大流或者二分图匹配.然而我不知道怎么打二分图匹配..打了最大流.这题字符串比较坑 ...

  6. POJ1087 A Plug for UNIX(网络流)

    在会议开始之前,你收集所有记者想要使用的设备,并尝试设置它们.你注意到有些设备使用没有插座的插头.你想知道这些设备是否来自建造这个房间时并不存在的国家.对于一些插座,有几个设备使用相应的插头.对于其他 ...

  7. POJ1087 A Plug for UNIX —— 最大流

    题目链接:https://vjudge.net/problem/POJ-1087 A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K T ...

  8. POJ1087:A Plug for UNIX(最大流)

    A Plug for UNIX 题目链接:https://vjudge.net/problem/POJ-1087 Description: You are in charge of setting u ...

  9. POJ1087 A Plug for UNIX(网络流)

                                       A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  10. 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 ...

随机推荐

  1. Java线程:概念与原理

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  2. IDL数组计算

    函数 作用 min 最小值 max 最大值 total 求和 stddev 标准差 mean 平均值  

  3. leetcode 171

    171. Excel Sheet Column Number Related to question Excel Sheet Column Title Given a column title as ...

  4. python中string模块

    >>> import string >>> string.ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL ...

  5. Mysql技术内幕(第四版)读书笔记(一)

    题记:写代码已经有2年了,学到了很多知识,但是没有一个好习惯去记录,去分享,好多知识点都会忘记,所以从今天开始学着像大牛一样去记录自己经历项目的点点滴滴,先从最近读<Mysql技术内幕>开 ...

  6. JTAG 学习 -SVF格式

    yxr注: 主要zt,附上自己的心得如下: 1)反观SVF文件,除了设置必要的条件之外(初始条件和TIR等四条命令),真正的运行命令就两条,SIR向JTAG TAP状态机的IR寄存器送命令,SDR往J ...

  7. 文法 LL1

    <程序>-><声明列表>|<程序><函数> <声明列表>-><声明>|<声明><声明列表> ...

  8. Content has been consumed

    if(response.getEntity() != null && response.getEntity().getContent() != null) { message = IO ...

  9. PHP判断请求是否是ajax请求

    首先看一下框架里面是怎样判断的.ThinkPHP:define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && str ...

  10. PLSQL登录数据库 报ORA -12154的诡异问题

    https://q.cnblogs.com/q/89420/ 现象: 1.机器上先后安装了oracle两个版本的client.在装第一个client后,plsql可以顺利连接数据库a并登录. 2.安装 ...