poj 1087 最大流

没啥好说的,慢慢建图

Sample Input

4
A
B
C
D
5
laptop B
phone C
pager B
clock B
comb X
3
B X
X A
X D 

Sample Output

1

题意:有n个不同的插座,有m台不同的机器需要m种插头,有k组转换:插头A能由插头B转换而来。问这些机器最少有几台不能插上插座。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #include<map>
  8 using namespace std;
  9 const int MAXN=500;
 10 const int INF=0x3fffffff;
 11 int g[MAXN][MAXN];//存边的容量,没有边的初始化为0
 12 int path[MAXN],flow[MAXN],start,end;
 13 int n;//点的个数,编号0-n.n包括了源点和汇点。
 14 queue<int>q;
 15 int bfs()
 16 {
 17     int i,t;
 18     while(!q.empty())q.pop();//把清空队列
 19     memset(path,-1,sizeof(path));//每次搜索前都把路径初始化成-1
 20     path[start]=0;
 21     flow[start]=INF;//源点可以有无穷的流流进
 22     q.push(start);
 23     while(!q.empty())
 24     {
 25         t=q.front();
 26         q.pop();
 27         if(t==end)break;
 28         //枚举所有的点,如果点的编号起始点有变化可以改这里
 29         for(i=0;i<=n;i++)
 30         {
 31             if(i!=start&&path[i]==-1&&g[t][i])
 32             {
 33                 flow[i]=flow[t]<g[t][i]?flow[t]:g[t][i];
 34                 q.push(i);
 35                 path[i]=t;
 36             }
 37         }
 38     }
 39     if(path[end]==-1)return -1;//即找不到汇点上去了。找不到增广路径了
 40     return flow[end];
 41 }
 42 int Edmonds_Karp()
 43 {
 44     int max_flow=0;
 45     int step,now,pre;
 46     while((step=bfs())!=-1)
 47     {
 48         max_flow+=step;
 49         now=end;
 50         while(now!=start)
 51         {
 52             pre=path[now];
 53             g[pre][now]-=step;
 54             g[now][pre]+=step;
 55             now=pre;
 56         }
 57     }
 58     return max_flow;
 59 }
 60
 61 map<string,int> hash;
 62 int main()
 63 {
 64     int i,j,k,m;
 65     //freopen("1.in","r",stdin);
 66     while(scanf("%d",&n)!=EOF)
 67     {
 68         hash.clear();
 69         memset(g,0,sizeof(g));
 70         string s1,s2,s3;
 71         start=0;
 72         end=1;
 73         int tot=2;
 74         while(n--)
 75         {
 76             cin>>s1;
 77             hash[s1]=tot;
 78             g[0][hash[s1]]=1;
 79             tot++;
 80         }
 81         scanf("%d",&m);
 82         for(i=0;i<m;i++)
 83         {
 84             cin>>s1>>s2;
 85             if(hash[s1]==0) hash[s1]=tot++;
 86             if(hash[s2]==0) hash[s2]=tot++;
 87             g[hash[s1]][end]=1;
 88             g[hash[s2]][hash[s1]]=1;
 89         }
 90         scanf("%d",&k);
 91         while(k--)
 92         {
 93             cin>>s1>>s2;
 94             if(hash[s1]==0) hash[s1]=tot++;
 95             if(hash[s2]==0) hash[s2]=tot++;
 96             g[hash[s2]][hash[s1]]=INF;
 97         }
 98         n=tot-1;    //总点数
 99         printf("%d\n",m-Edmonds_Karp());
100     }
101     return 0;
102 }
时间: 2024-10-06 14:48:26

poj 1087 最大流的相关文章

POJ 1087 最大流裸题 + map

A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15597   Accepted: 5308 Description You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXecutive (UNIX), which has an int

POJ 1087 A Plug for UNIX (网络最大流)

POJ 1087 A Plug for UNIX 链接:http://poj.org/problem?id=1087 题意:有n(1≤n≤100)个插座,每个插座用一个数字字母式字符串描述(至多有24 个字符).有m(1≤m≤100)个设备,每个设备有名称,以及它使用的插头的名称:插头的名称跟它所使用的插座的名称是一样的:设备名称是一个至多包含24 个字母数字式字符的字符串:任何两个设备的名称都不同:有k(1≤k≤100)个转换器,每个转换器能将插座转换成插头. 样例: 4 A B C D 5

POJ 1087 A Plug for UNIX(网络流之最大流)

题目地址:POJ 1087 不知道是谁把这题化为了二分最大匹配的专题里..于是也没多想就按照二分图的模型来建的(虽然当时觉得有点不大对...).后来发现二分最大匹配显然不行..有权值..直接来个最大流多方便..然后一直WA..后来仔细想了想..这根本就不能建二分图啊....这题跟二分图一点关系都没有.... 这题的建图思路是让源点与每一个设备的插座类型连边,让汇点与每一个插座连边.然后用floyd判断该设备能否通过转换转换成可以插的插座上.只要可以转换成的就连边,权值为INF.然后求一次最大流,

POJ 1087 A Plug for UNIX 会议室插座问题 构图+最大流

题目链接:POJ 1087 A Plug for UNIX A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13809   Accepted: 4623 Description You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXec

poj 3281 最大流+建图

很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很妙! 题意就是有N头牛,F个食物,D个饮料. N头牛每头牛有一定的喜好,只喜欢几个食物和饮料. 每个食物和饮料只能给一头牛.一头牛只能得到一个食物和饮料. 而且一头牛必须同时获得一个食物和一个饮料才能满足.问至多有多少头牛可以获得满足. 最初相当的是二分匹配.但是明显不行,因为要分配两个东西,两个东

poj 1087 A Plug for UNIX 【最大流】

题目连接:http://poj.org/problem?id=1087 题意: n种插座 ,m个电器,f组(x,y)表示插座x可以替换插座y,问你最多能给几个电器充电. 解法:起点向插座建边,容量1,电器向汇点建边,容量1,插座向电器建边,容量1,可以替换的插座间建边,容量无穷大.然后套板子...求最大流. 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h>

POJ 1087 A Plug for UNIX (最大流)

A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K       Description You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXecutive (UNIX), which has an international mandate to make the free

POJ 1087 A Plug for UNIX(最大流dinic)

Description You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXecutive (UNIX), which has an international mandate to make the free flow of information and ideas on the Internet as cumbersome and

C - A Plug for UNIX - poj 1087(最大流)

题目大意:这个题意有些蛋疼,看了很大会才明白什么意思,有N个插座,这些插座都是有类型的只能给这种类型的电器充电,下面接着给了M种电器,和电器的插头类型,还有K种转换器,可以把一种类型转换成另一种,转换器也是可以串联使用的. 输入说明: 首先输入的是一个N,下面有N种插座,每种插座都有一个字符串代表,接着输入一个M,表示有M个电器需要充电,输入的每行有一个电器和它需要的插座类型,然后输入一个K,下面有K个转换器. 分析:这个英文写的这么长确实比较难理解,不过看懂题意后也是比较容易了,可以让电器给可