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. php 正则表达式 将形如 "天," ,"安", "门" 转化为"天、安、门", (仅匹配汉字)

    #!/usr/bin/php<? $rows = file("illwods_deal1.txt"); $goalfile = fopen("illwods_res ...

  2. Mutex

    #include "stdafx.h" #include <string> #include <iostream> #include <Windows ...

  3. Ninject之旅之三:Ninject对象生命周期

    摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生 ...

  4. 在Ubuntu上安装Mysql For Python

    安装: 首先安装pip,并且把pip更新到最小版本 apt-get install python-pip pip install -U pip 安装mysql开发包 apt-get install p ...

  5. jdk1.7和jdk1.8的String的getByte方法的差异

    最近遇到一个奇葩的bug,jdk1.7下正常的程序到了jdk1.8下就不能用了,经过查找原因发现是因为jdk版本升级导致的获取的getbyte时得到的byte数组不同造成的.

  6. 配合crond服务实现自定义周期备份MySQL数据库(使用innobackupex进行备份)

    备份 新建一个脚本/root/backup.py,内容如下: #!/usr/bin/env python# -*- coding: utf-8 -*- ''' 脚本作者:昨夜星辰 脚本作用:配合cro ...

  7. hive中rcfile格式(收藏文)

    首先声明,此文是属于纯粹收藏文,感觉讲的很不错. 本文介绍了Facebook公司数据分析系统中的RCFile存储结构,该结构集行存储和列存储的优点于一身,在MapReduce环境下的大规模数据分析中扮 ...

  8. localstorage sessionstorage cookie 备忘

    /* sessionStorage: 保存的数据用于浏览器的一次会话,当会话结束(通常是该窗口关闭),数据被清空: localStorage: 保存的数据长期存在,下一次访问该网站的时候,网页可以直接 ...

  9. 关于rank、dense_rank、ROW_NUMBER及OVER(PARTITION BY)、OVER(ORDER BY)的一些用法

    CREATE TABLE t_harry ( id int NOT NULL, ) DEFAULT NULL, ChannelID ) DEFAULT NULL, TimeStamp datetime ...

  10. leetCode 354. Russian Doll Envelopes

    You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...