很裸的一道最大流
格式懶得排了,注意把人拆成兩份,乙份連線食物,乙份連線飲料
4 3 3 //4個人,3種食物,3種飲料1 1 1 //食物每種分別為1
1 1 1 //飲料每種數目分別為1
yyn //第乙個人對第1,2,3種食物的態度為接受,接受和拒絕
nyyyny
ynyyny //第乙個人對第1,2,3種飲料的態度為接受,拒絕和接受
yynyyn
nny
3
1 #include2 #include3 #include4 #include5 #include6 #include7using
namespace
std;
8const
int maxn=11005;9
const
int maxn = 10010;//
點數的最大值
10const
int maxm = 400010;//
邊數的最大值
11const
int inf = 0x3f3f3f3f;12
struct
edge
13edge[maxm];//
注意是maxm
16int
tol;
17int
head[maxn];
18int
gap[maxn],dep[maxn],cur[maxn];
19void
init()
2024
void addedge(int u,int v,int w,int rw = 0)25
31int
q[maxn];
32void bfs(int start,int
end)
3351}52
}53ints[maxn];
54int sap(int start,int end,int
n)55
73for(int i = 0;i < top;i++)
7478 ans +=min;
79 top =inser;
80 u = edge[s[top]^1
].to;
81continue;82
}83bool flag = false;84
intv;
85for(int i = cur[u]; i != -1; i =edge[i].next)
8694}95
if(flag)
96101
int min =n;
102for(int i = head[u]; i != -1; i =edge[i].next)
103if(edge[i].cap - edge[i].flow && dep[edge[i].to] 104108 gap[dep[u]]--;
109if(!gap[dep[u]])return
ans;
110 dep[u] = min + 1
;111 gap[dep[u]]++;
112if(u != start)u = edge[s[--top]^1
].to;
113}
114return
ans;
115}
116int g[2000][2000
];117
intmain()
118135
for(i=f+2*n+1;i<=f+2*n+d;i++)
136140
for(i=1;i<=n;i++)
141144
char s[250
];145
for(i=1;i<=n;i++)
146154
}155
}156
for(i=1;i<=n;i++)
157165
}166
}167 printf("
%d\n
",sap(start,end,d+f+2*n+1
));168
}169
return0;
170 }
hdu 4292 拆點 最大流)
思路 為了控制乙個人只連一瓶飲料,乙份食物,那麼我們可以把乙個人拆成兩個,他們之間連一條權值為1的邊,另外左邊連它喜歡的食物,權值為1,右邊連它喜歡的飲料,權值為1,在起點連食物的時候加流量限制,終點加流量限制,跑一遍最大流即可。1 include2 include3 include4 using ...
hdu 4292 拆點 最大流)
思路 為了控制乙個人只連一瓶飲料,乙份食物,那麼我們可以把乙個人拆成兩個,他們之間連一條權值為1的邊,另外左邊連它喜歡的食物,權值為1,右邊連它喜歡的飲料,權值為1,在起點連食物的時候加流量限制,終點加流量限制,跑一遍最大流即可。1 include2 include3 include4 using ...
HDU 4292 網路流最大流
題目大意 有n個人,f的food,d的飲料,每個人對事物和飲料有偏好,並且如果乙個人沒有飲料或者事物他就會離開,問最後最多有幾個人留下來 題目解析 開始是超級食物匯點,中間是人,因為每個人最多選一種食物,所以人與自己也要加一條邊,最後是超級飲料匯點,最大流ek即可 ac include includ...