POJ 1087 A Plug for UNIX(一道网络流引起的思考)

题目大意:n个插座,m个电器及其插头,k个转化器,问最多有多少设备可以使用。一种转换器可以有无限多个。

建模方法:(假设插座与源点相连,电器与汇点相连)

第一种:很显然,最开始想到的是,插座与源点连边,插座与对应的插头要连边,插头与对应的电器连边,电器与汇点连边,转换器的插座与插头连边。

如图:(三个转换器:x可转换为B,A可转换成X,D可转换成X)根据下图,插座盒插头之间边值为inf,最大流即为最多能够接入的电器。唯一麻烦的是点比较多,处理点对应关系的时候稍微麻烦点。


网上大部分的程序都是下面的建图方法,不知道我理解的对不对,如果有不对的地方,希望可以共同讨论。

至于下面建图的好处,就是点的个数变少了,而且在处理加边的时候对应关系比较明朗。

第二种:观察上图,其实我们发现,如果不考虑插座之间的转换关系,插座和插头是一一对应的,那我们可以把这两个点缩成一个点,然后在加上插座之间的转换关系。如图。



注意,如果是电器与源点相连,插座与汇点相连,那么图中彩色的边要反向。我不太清楚为什么要这么做,还可以再讨论讨论。但是可以这么理解:对于转换器

B- X,可以将B插头转换为X插头(前一种是将X插座转换为B插座,插座转插座,这里是插头转插头),则两点连一条边。如图。


代码如下:

/*
建图方式:插座与源点连边,电器与汇点连边
Accepted	780 KB	16 ms	G++	2782 B
*/
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<map>
#include<queue>
using namespace std;
const int maxn=400+10;//开了一次200wa了,不知道为什么
const int maxm=1000+10;
const int inf=9999999;
int m,n,k;
struct Edge
{
    int to,next;
    int cap;
}edge[maxm*2];
int head[maxn],size;
int dis[maxn];//层次网络的编号值,离汇点的距离
void clear()//链式前向星
{
    size=0;
    memset(head,-1,sizeof(head));
}
void _add(int from,int to,int cap)
{
    edge[size].to=to;
    edge[size].cap=cap;
    edge[size].next=head[from];
    head[from]=size++;
}
void add(int a,int b,int c)
{
    _add(a,b,c);
    _add(b,a,0);
}
bool bfs(int s,int t)//对层次网络进行编号
{
    queue<int> Q;
    memset(dis,-1,sizeof(dis));//将所有点的层次设为-1
    dis[s]=0;//s入队
    Q.push(s);
    while(!Q.empty())
    {
        int v=Q.front();Q.pop();//取队首元素
        if(v==t)return true;
        for(int i=head[v];i!=-1;i=edge[i].next)//找邻接点
        {
            if(dis[edge[i].to]==-1&&edge[i].cap>0)//如果存在邻接点并且还未被编入层次网络
            {
                dis[edge[i].to]=dis[v]+1;
                Q.push(edge[i].to);
            }
        }
    }
    return false;
}
int dfs(int x,int t,int maxc)//从节点x到汇点t的最大可增广流量,maxc表示当前可容许的最大容量
{
    if(x==t)return maxc;
    int ret,flow;ret=0;
    for(int i=head[x];i!=-1;i=edge[i].next)
    {
        if(edge[i].cap>0&&dis[edge[i].to]==dis[x]+1)
        {
            flow=dfs(edge[i].to,t,min(maxc-ret,edge[i].cap));
            edge[i].cap-=flow;
            edge[i^1].cap+=flow;
            ret+=flow;
            if(ret==maxc)return ret;
        }
    }
    return ret;
}
int dinic(int s,int t)
{
    int ans=0;
    while(bfs(s,t))//每次重建层次网络
    ans+=dfs(s,t,inf);//如果找到一条增广路
    return ans;
}
int main()
{
        //freopen("in","r",stdin);
        char str[30],str1[30];
        int num=0;
        clear();
        map<string,int> my;//记录编号
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",str);
            my[str]=i;
        }
        scanf("%d",&m);
        num=n;
        int T=n+m+1;
        //电器编号1~m,这样方便处理
        for(int i=1;i<=m;i++)//插头电器连边,插座插头连边(可以缩成一点),电器汇点连边
        {
            scanf("%s %s",str1,str);
            if(my[str]==0)
            {
                my[str]=++num;
            }
            add(my[str]+m,i,1);
            add(i,T,1);
        }
        for(int i=1;i<=n;i++)//N个插座与源点连
        add(0,i+m,1);

        scanf("%d",&k);
        for(int i=0;i<k;i++)//插座之间连边
        {
            scanf("%s %s",str1,str);
            add(my[str]+m,my[str1]+m,inf);//此处如果是插座与汇点连边,与本处建图相反,则应反向,参考图2,3
        }
        printf("%d\n",m-dinic(0,T));
    return 0;
}

附上几组测试数据:来自poj discuss

input:
4
A
B
C
D
6
a 0
b 1
c 2
d 3
e 4
f 5
9
0 A
0 D
1 A
1 B
2 B
2 C
3 C
4 A
5 A
output:
2
input:
5
A
B
C
D
E
5
a 0
b 1
c 2
d 3
e 4
9
0 A
0 D
1 A
1 B
2 B
2 C
2 E
3 C
4 B
output:
0
input:
5
A
B
C
D
E
6
a C
b C
c C
d C
e A
f A
4
C E
E D
E B
B A
output:
1
input:
5
A
B
C
D
E
4
a W
b X
c Y
d Z
4
W X
X Y
Y Z
Z Q
output:
4
input:
30
r0
r1
r2
r3
r4
r5
r6
r7
r8
r9
r10
r11
r12
r13
r14
r15
r16
r17
r18
r19
r20
r21
r22
r23
r24
r25
r26
r27
r28
r29
30
d0 p0
d1 p1
d2 p2
d3 p3
d4 p4
d5 p5
d6 p6
d7 p7
d8 p8
d9 p9
d10 p10
d11 p11
d12 p12
d13 p13
d14 p14
d15 p15
d16 p16
d17 p17
d18 p18
d19 p19
d20 p20
d21 p21
d22 p22
d23 p23
d24 p24
d25 p25
d26 p26
d27 p27
d28 p28
d29 p29
100
p15 r19
p12 r21
p12 r11
p7 r2
p10 r16
p29 r4
p3 r17
p23 r28
p27 r1
p18 r2
p3 r29
p5 r8
p14 r9
p23 r0
p29 r0
p18 r14
p19 r22
p27 r24
p3 r5
p18 r5
p21 r10
p10 r17
p27 r25
p15 r16
p27 r4
p18 r22
p25 r15
p0 r9
p25 r23
p1 r16
p16 r11
p0 r27
p3 r19
p13 r29
p24 r2
p4 r8
p4 r6
p2 r2
p9 r21
p28 r19
p13 r24
p4 r14
p3 r21
p29 r27
p7 r15
p8 r29
p13 r12
p19 r18
p20 r7
p5 r16
p6 r22
p9 r8
p25 r18
p29 r15
p9 r4
p18 r13
p2 r25
p25 r10
p24 r0
p14 r5
p19 r17
p3 r1
p17 r8
p18 r15
p23 r27
p23 r10
p8 r14
p25 r7
p10 r21
p17 r12
p16 r4
p14 r10
p5 r21
p8 r24
p0 r11
p17 r17
p11 r5
p2 r26
p25 r17
p6 r25
p23 r24
p24 r12
p29 r28
p11 r1
p19 r20
p5 r5
p24 r19
p7 r21
p10 r7
p7 r11
p10 r25
p20 r22
p22 r15
p18 r17
p24 r17
p4 r18
p11 r29
p22 r2
p3 r8
p15 r0
output:
2
input:
100
r0
r1
r2
r3
r4
r5
r6
r7
r8
r9
r10
r11
r12
r13
r14
r15
r16
r17
r18
r19
r20
r21
r22
r23
r24
r25
r26
r27
r28
r29
r30
r31
r32
r33
r34
r35
r36
r37
r38
r39
r40
r41
r42
r43
r44
r45
r46
r47
r48
r49
r50
r51
r52
r53
r54
r55
r56
r57
r58
r59
r60
r61
r62
r63
r64
r65
r66
r67
r68
r69
r70
r71
r72
r73
r74
r75
r76
r77
r78
r79
r80
r81
r82
r83
r84
r85
r86
r87
r88
r89
r90
r91
r92
r93
r94
r95
r96
r97
r98
r99
100
d0 p0
d1 p1
d2 p2
d3 p3
d4 p4
d5 p5
d6 p6
d7 p7
d8 p8
d9 p9
d10 p10
d11 p11
d12 p12
d13 p13
d14 p14
d15 p15
d16 p16
d17 p17
d18 p18
d19 p19
d20 p20
d21 p21
d22 p22
d23 p23
d24 p24
d25 p25
d26 p26
d27 p27
d28 p28
d29 p29
d30 p30
d31 p31
d32 p32
d33 p33
d34 p34
d35 p35
d36 p36
d37 p37
d38 p38
d39 p39
d40 p40
d41 p41
d42 p42
d43 p43
d44 p44
d45 p45
d46 p46
d47 p47
d48 p48
d49 p49
d50 p50
d51 p51
d52 p52
d53 p53
d54 p54
d55 p55
d56 p56
d57 p57
d58 p58
d59 p59
d60 p60
d61 p61
d62 p62
d63 p63
d64 p64
d65 p65
d66 p66
d67 p67
d68 p68
d69 p69
d70 p70
d71 p71
d72 p72
d73 p73
d74 p74
d75 p75
d76 p76
d77 p77
d78 p78
d79 p79
d80 p80
d81 p81
d82 p82
d83 p83
d84 p84
d85 p85
d86 p86
d87 p87
d88 p88
d89 p89
d90 p90
d91 p91
d92 p92
d93 p93
d94 p94
d95 p95
d96 p96
d97 p97
d98 p98
d99 p99
100
p95 r21
p44 r99
p52 r5
p53 r24
p92 r32
p89 r20
p85 r45
p33 r32
p89 r45
p14 r38
p27 r77
p47 r32
p8 r99
p3 r50
p77 r78
p0 r72
p99 r96
p23 r4
p1 r29
p80 r45
p61 r70
p66 r99
p67 r99
p83 r8
p97 r98
p46 r76
p75 r93
p8 r35
p93 r11
p85 r70
p90 r37
p94 r41
p33 r69
p45 r87
p98 r26
p32 r12
p96 r98
p63 r15
p50 r46
p23 r99
p44 r69
p75 r20
p14 r84
p7 r7
p47 r45
p29 r37
p82 r23
p31 r68
p45 r76
p55 r43
p54 r87
p7 r2
p38 r22
p17 r40
p69 r40
p39 r65
p61 r66
p37 r76
p2 r45
p83 r50
p90 r65
p39 r24
p88 r70
p92 r33
p99 r47
p29 r53
p35 r88
p56 r25
p11 r73
p65 r32
p66 r56
p97 r27
p22 r87
p55 r25
p32 r91
p27 r74
p56 r66
p98 r96
p89 r91
p82 r88
p38 r11
p93 r25
p51 r49
p50 r14
p75 r67
p98 r41
p23 r48
p20 r98
p35 r28
p23 r67
p19 r2
p41 r75
p68 r91
p71 r9
p82 r53
p97 r73
p16 r91
p98 r20
p92 r1
p86 r67
output:
49
input:
20
r0
r1
r2
r3
r4
r5
r6
r7
r8
r9
r10
r11
r12
r13
r14
r15
r16
r17
r18
r19
20
d0 p0
d1 p1
d2 p2
d3 p3
d4 p4
d5 p5
d6 p6
d7 p7
d8 p8
d9 p9
d10 p10
d11 p11
d12 p12
d13 p13
d14 p14
d15 p15
d16 p16
d17 p17
d18 p18
d19 p19
20
p10 r7
p5 r1
p6 r10
p15 r2
p17 r9
p10 r3
p6 r3
p6 r14
p4 r16
p3 r5
p6 r17
p9 r4
p2 r19
p19 r0
p3 r1
p7 r0
p2 r6
p10 r10
p8 r19
p19 r19
output:
9
input:
3
A
B
C
5
a a
b b
c c
x p99
d d
100
p1 p0
p2 p1
p3 p2
p4 p3
p5 p4
p6 p5
p7 p6
p8 p7
p9 p8
p10 p9
p11 p10
p12 p11
p13 p12
p14 p13
p15 p14
p16 p15
p17 p16
p18 p17
p19 p18
p20 p19
p21 p20
p22 p21
p23 p22
p24 p23
p25 p24
p26 p25
p27 p26
p28 p27
p29 p28
p30 p29
p31 p30
p32 p31
p33 p32
p34 p33
p35 p34
p36 p35
p37 p36
p38 p37
p39 p38
p40 p39
p41 p40
p42 p41
p43 p42
p44 p43
p45 p44
p46 p45
p47 p46
p48 p47
p49 p48
p50 p49
p51 p50
p52 p51
p53 p52
p54 p53
p55 p54
p56 p55
p57 p56
p58 p57
p59 p58
p60 p59
p61 p60
p62 p61
p63 p62
p64 p63
p65 p64
p66 p65
p67 p66
p68 p67
p69 p68
p70 p69
p71 p70
p72 p71
p73 p72
p74 p73
p75 p74
p76 p75
p77 p76
p78 p77
p79 p78
p80 p79
p81 p80
p82 p81
p83 p82
p84 p83
p85 p84
p86 p85
p87 p86
p88 p87
p89 p88
p90 p89
p91 p90
p92 p91
p93 p92
p94 p93
p95 p94
p96 p95
p97 p96
p98 p97
p99 p98
p0 A
output:
4
input:
100
a0
a1
a2
a3
a4
a5
a6
a7
a8
a9
a10
a11
a12
a13
a14
a15
a16
a17
a18
a19
a20
a21
a22
a23
a24
a25
a26
a27
a28
a29
a30
a31
a32
a33
a34
a35
a36
a37
a38
a39
a40
a41
a42
a43
a44
a45
a46
a47
a48
a49
a50
a51
a52
a53
a54
a55
a56
a57
a58
a59
a60
a61
a62
a63
a64
a65
a66
a67
a68
a69
a70
a71
a72
a73
a74
a75
a76
a77
a78
a79
a80
a81
a82
a83
a84
a85
a86
a87
a88
a89
a90
a91
a92
a93
a94
a95
a96
a97
a98
a99
100
b0 c0
b1 c1
b2 c2
b3 c3
b4 c4
b5 c5
b6 c6
b7 c7
b8 c8
b9 c9
b10 c10
b11 c11
b12 c12
b13 c13
b14 c14
b15 c15
b16 c16
b17 c17
b18 c18
b19 c19
b20 c20
b21 c21
b22 c22
b23 c23
b24 c24
b25 c25
b26 c26
b27 c27
b28 c28
b29 c29
b30 c30
b31 c31
b32 c32
b33 c33
b34 c34
b35 c35
b36 c36
b37 c37
b38 c38
b39 c39
b40 c40
b41 c41
b42 c42
b43 c43
b44 c44
b45 c45
b46 c46
b47 c47
b48 c48
b49 c49
b50 c50
b51 c51
b52 c52
b53 c53
b54 c54
b55 c55
b56 c56
b57 c57
b58 c58
b59 c59
b60 c60
b61 c61
b62 c62
b63 c63
b64 c64
b65 c65
b66 c66
b67 c67
b68 c68
b69 c69
b70 c70
b71 c71
b72 c72
b73 c73
b74 c74
b75 c75
b76 c76
b77 c77
b78 c78
b79 c79
b80 c80
b81 c81
b82 c82
b83 c83
b84 c84
b85 c85
b86 c86
b87 c87
b88 c88
b89 c89
b90 c90
b91 c91
b92 c92
b93 c93
b94 c94
b95 c95
b96 c96
b97 c97
b98 c98
b99 c99
100
d0 e0
d1 e1
d2 e2
d3 e3
d4 e4
d5 e5
d6 e6
d7 e7
d8 e8
d9 e9
d10 e10
d11 e11
d12 e12
d13 e13
d14 e14
d15 e15
d16 e16
d17 e17
d18 e18
d19 e19
d20 e20
d21 e21
d22 e22
d23 e23
d24 e24
d25 e25
d26 e26
d27 e27
d28 e28
d29 e29
d30 e30
d31 e31
d32 e32
d33 e33
d34 e34
d35 e35
d36 e36
d37 e37
d38 e38
d39 e39
d40 e40
d41 e41
d42 e42
d43 e43
d44 e44
d45 e45
d46 e46
d47 e47
d48 e48
d49 e49
d50 e50
d51 e51
d52 e52
d53 e53
d54 e54
d55 e55
d56 e56
d57 e57
d58 e58
d59 e59
d60 e60
d61 e61
d62 e62
d63 e63
d64 e64
d65 e65
d66 e66
d67 e67
d68 e68
d69 e69
d70 e70
d71 e71
d72 e72
d73 e73
d74 e74
d75 e75
d76 e76
d77 e77
d78 e78
d79 e79
d80 e80
d81 e81
d82 e82
d83 e83
d84 e84
d85 e85
d86 e86
d87 e87
d88 e88
d89 e89
d90 e90
d91 e91
d92 e92
d93 e93
d94 e94
d95 e95
d96 e96
d97 e97
d98 e98
d99 e99
output:
100
input:
4
A
B
C
D
5
laptop B
phone C
pager B
clock B
comb X
3
B X
X A
X D
ouotput:
1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值