| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:搬运一个网络流代码(非原创)In Reply To:搬运一个网络流代码(非原创) Posted by:CuriousCat at 2017-01-15 08:08:38 > 性质一·任何一对顶点间==0和其他顶点间。
> 考虑0到1有三条路径A1,A2,A3,0到2有三条B1,B2,B3。
> A1+B1就是一条从1到2很好的路径。(没有重合点)
> 他们之间最多会有两条路径有相同顶点,此时只需要从重合的点开始走即可。(有)
> ---------------------------------------------------------------------------
> #include <iostream>
> #include <vector>
> #include <cstring>
> #include <algorithm>
> #include <cstdio>
> #define MAX_N 550
> #define MAX_M 50050
>
> using namespace std;
>
> vector<int> G[MAX_N];
> int match[MAX_N];
> bool matchdst[MAX_N], vis[MAX_N];
>
> int dfs(int from, int to) {
> for (int i = G[from].size() - 1;i >= 0;--i) {
> int v = G[from][i];
> if (v == to) {
> if (matchdst[from]) continue;
> matchdst[from] = true;
> return true;
> }
> if (vis[v]) continue;
> vis[v] = true;
> if (dfs(match[v], to)) {
> match[v] = from;
> return true;
> }
> }
> return false;
> }
>
> bool flow(int from, int to, int n) {
> for (int i = 0;i < n;++i) match[i] = i;
> memset(matchdst, 0, sizeof(matchdst));
> for (int i = 0;i < 3;++i) {
> memset(vis, 0, sizeof(vis));
> if (!dfs(from, to)) return false;
> }
> return true;
> }
>
> bool solve(int n, int m) {
> for (int i = 1;i < n;++i)
> if (!flow(0, i, n)) return false;
> return true;
> }
>
> int main(int argc,char *argv[]) {
> int n, m;
> while (true) {
> scanf("%d%d", &n, &m);
> if (n == 0 && m == 0) break;
> for (int i = 0;i < n;++i) G[i].push_back(i);
> for (int i = 0, a, b;i < m;++i) {
> scanf("%d%d", &a, &b);
> G[a].push_back(b), G[b].push_back(a);
> }
> bool ans = solve(n, m);
> printf("%s\n", ans ? "YES" : "NO");
> for (int i = 0;i < n;++i) G[i].clear();
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator