| ||||||||||
| 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:zxxb at 2008-12-30 09:36:00 We can split every node p into twonodes: p_in and p_out, then we can constructed a directed bipartite graph.
Source Code
Problem: 3713 User: ikeay
Memory: 908K Time: 3891MS
Language: G++ Result: Accepted
Source Code
#include <assert.h>
#include <ctype.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <algorithm>
#include <complex>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define SZ(a) (int)(a).size()
#define FOR(i,a,b) for (int i=(a); i<=(b); ++i)
#define REP(i,n) for (int i=0; i<(n); ++i)
#define ALL(c) c.begin(), c.end()
#define CLR(c,n) memset(c, n, sizeof(c))
#define CONTAIN(it, c) (c.find(it) != c.end())
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef long long LL;
template <class T> void checkmin(T &a, T b) { if (b<a) a=b; }
template <class T> void checkmax(T &a, T b) { if (b>a) a=b; }
const int MAXN=512, MAXM=40<<10;
int n, e, head[MAXN], nextid[MAXM], dest[MAXM], match[MAXN];
bool matchdst[MAXN], visited[MAXN];
void add_edge(int src, int dst) {
dest[e] = dst;
nextid[e] = head[src];
head[src] = e;
++e;
}
bool go(int src, int dst) {
for (int i = head[src]; i != -1; i = nextid[i]) {
int next = dest[i];
if (next == dst) {
if (matchdst[src]) continue;
matchdst[src] = true;
return true;
}
if (visited[next]) continue;
visited[next] = true;
if (go(match[next], dst)) {
match[next] = src;
return true;
}
}
return false;
}
bool check(int src, int dst) {
REP(i, n) match[i] = i;
CLR(matchdst, 0);
REP(i, 3) {
CLR(visited, 0);
if (!go(src, dst)) return false;
}
return true;
}
bool go(void) {
for (int i = 1; i < n; ++i)
if (!check(0, i) || !check(i, 0))
return false;
return true;
}
int main(int argc, char *argv[]) {
int m, a, b;
while (scanf("%d%d", &n, &m) == 2 && n > 0) {
CLR(head, -1); e = 0;
REP(i, n) add_edge(i, i);
while (m--) scanf("%d%d", &a, &b), add_edge(a, b), add_edge(b, a);
printf("%s\n", go() ? "YES" : "NO");
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator