Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

搬运一个网络流代码(非原创)

Posted by CuriousCat at 2017-01-15 08:08:38 on Problem 3713 and last updated at 2017-01-15 08:15:56
性质一·任何一对顶点间==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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator